- Java code
public class TerminalServer extends Thread{ private int Port; /** * 接收终端数据缓冲长度 */ public static int TerminalDataSize = 1024; private static DatagramSocket dsocket; private static DatagramPacket dpacket; public TerminalServer(int port) { Port = port; } public void run(){ try{ byte buffer[] = new byte[TerminalDataSize]; TerminalInfo ti = new TerminalInfo(); dsocket = new DatagramSocket(Port); for(;;){ dpacket = new DatagramPacket(buffer,buffer.length); dsocket.receive(dpacket); } }catch(Exception e){ logger.error("终端数据接收线程发生异常",e); } }
我这边接收客户端发过来的信息,把它放在buffer这个byte数组中,它那边不断的发,我现在的问题是,
它发过来,我不可能直接解析buffer数组,是不是应该把数据存到别的地方,然后它空出来继续接收别的数据,想法是这样的,但是不知道该怎么往下写,刚接触这部分,还请大家指教一下!谢谢
------解决方案--------------------
每次收都应该起一个线程。
------解决方案--------------------
每次接收前都分配一块新的内存空间,这样就不会有共享问题了;
不然你这边收完了,那边正准备处理,然后你这边又要重新放东西进去,自然会有问题;
不过看你的代码,已经做了这个工作:dpacket = new DatagramPacket(buffer,buffer.length);
因为每个接收到并传给dsocket.receive();的dpacket都是新new的;
只要dpacket里没有buffer的副本,就没有问题
就是说dpacket的属性都是 a=buffer【0】,b=buffer【1】;就没有问题;
如果有byte[] c=buffer;就有问题
因为c跟buffer指向同一个byte[]对象;
------解决方案--------------------
另外,按照你的代码来看
你没有在多个线程中共用一个对象
所以完全没有问题
你接收完了处理,处理完了再接收而已。。。。
------解决方案--------------------
- Java code
TerminalInfo ti = new TerminalInfo(); dsocket = new DatagramSocket(Port); for(;;){ dpacket = new DatagramPacket(new byte[TerminalDataSize],TerminalDataSize); dsocket.receive(dpacket); //... ... }
------解决方案--------------------
- Java code
public class TerminalServer extends Thread{ private int Port; /** * 接收终端数据缓冲长度 */ public static int TerminalDataSize = 1024; private static DatagramSocket dsocket; private static DatagramPacket dpacket;[color=#FF0000]public static final ConcurrentLinkedQueue<DatagramPacket> udpqueue = new ConcurrentLinkedQueue<DatagramPacket>();[/color] public TerminalServer(int port) { Port = port; } public void run(){ try{ byte buffer[] = new byte[TerminalDataSize]; TerminalInfo ti = new TerminalInfo(); dsocket = new DatagramSocket(Port); for(;;){ dpacket = new DatagramPacket(buffer,buffer.length); dsocket.receive(dpacket); [color=#FF0000]udpqueue.add(packet);[/color] } }catch(Exception e){ logger.error("终端数据接收线程发生异常",e); } }
------解决方案--------------------
那要看你写这个东西是干什么用的,不同需求不同的设计方法
------解决方案--------------------
可以用线程池解决这个问题。