栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Android UDP通讯

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android UDP通讯

很抱歉没有尽快更新。该问题已修复如下:

我需要将DatagramSocket存储到每个线程。侦听套接字还应该是用于继续服务器与客户端之间的通信的套接字。这是更新代码的位。

线程上的新套接字注册代码:

public void setCommSocket(DatagramPacket pkt, int port, DatagramSocket skt){  comm_ip = pkt.getAddress();  comm_port = pkt.getPort();  synchronized(comm_pkt) {    comm_pkt = pkt;  }  comm_skt = skt;}

新服务器侦听代码:

public void UDPListen() {        while(true) { synchronized(stop) {     if(stop)         break; } byte[] recieve_data = new byte[64]; DatagramPacket rpkt = new DatagramPacket(recieve_data, recieve_data.length); try {     datagram_server_socket.receive(rpkt);     int port = 0;     byte[] rdata = rpkt.getData();     port += rdata[0]<<24;     port += rdata[1]<<16;     port += rdata[2]<<8;     port += (0xFF)&rdata[3];     byte[] tid = new byte[rdata.length];     for(int i = 4; i < rdata.length && rdata[i] > 0; i++)     {         tid[i-4] = rdata[i];     }     String thread_id = new String(tid).trim();     for(int i = 0; i < threads.size(); i++) {         ClientThread t = threads.get(i);         if(t.getThreadId().compareTo(thread_id) == 0)         {  t.setCommSocket(rpkt, port, datagram_server_socket);         } else {  System.err.println("THREAD ID " + thread_id + " COULD NOT BE FOUND");         }     } } catch (IOException e) {     if(!(e instanceof SocketException) && !(e instanceof SocketTimeoutException))         log.warning("Error while listening for an UDP Packet."); } finally {     for(int i = 0; i < threads.size(); i++) {         ClientThread t = threads.get(i);         t.sendKeepAlive();     } }        }    }

我将省略服务器/线程结构的一些更新。这里的重要部分是接收到数据包的套接字被重新用于将数据发送回客户端。此外,实际的数据包被重新用于发送数据:

public void sendIdle() {        if(comm_ip != null) { synchronized(comm_pkt) {     try {         comm_pkt.setData(new byte[]{1, ProtocolWrapper.IDLE});         comm_skt.send(comm_pkt);     } catch (Exception e) {         e.printStackTrace();     } }        }    }

这是我的包装器类的相关部分,显示了每个线程持有的内容:

public class PeerWrapper {    private InetAddress ipaddress;    private Integer port;    private Socket client_socket;    private InetAddress comm_ip;    private DatagramSocket comm_skt;    private DatagramPacket comm_pkt;    private int comm_port;    private byte status;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号