日期:2014-05-20  浏览次数:20678 次

基于udp的socket通信的数据接收问题?
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);
        }
    }

------解决方案--------------------
那要看你写这个东西是干什么用的,不同需求不同的设计方法
------解决方案--------------------
可以用线程池解决这个问题。