jackyrong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

java中的UDP,也是十分有用的,比如可以用其编个简单的二人聊天程序,最近学习这方面知识,现摘录着。我们可以使用datagrampacket类和datagramsocket类,datagramsocket类用来创建接收和发送UDP的SOCKET实例,而datagrampacket类则是用于处理报文,将byter数组,目标地址,目标端口等数据包装成报文或者将报文拆成BYTE数组。

下面给出简单的代码段
  int portIn = 5000;//输入端口
  int portOut = 5001;//输出端口

  DatagramPacket sendpacket,receivepacket;//声明发送和接收数据包
  DatagramSocket sendsocket,receivesocket;//声明发送和接收DatagramSocket

初始化:
 try {     
        sendsocket=new DatagramSocket(5001);//实例化DatagramSocket类作为输出端
           receivesocket=new DatagramSocket(5000);//实例化DatagramSocket类作为输入端
           online = !(sendsocket.isClosed());
      }
      catch(SocketException se){//异常捕获
         se.printStackTrace() ;
         System.exit(0);
     }
  }

之后,输入对方IP地址,并且连接对方,其核心代码为
    portIn = (int) Integer.parseInt(str2);
     portOut = (int) Integer.parseInt(str3);
  
     
     if(online){
      sendsocket.close();
      receivesocket.close();
      textArea1.append("\n formal connection closed");
     }
           
     try {
       textArea1.append("\n building a connection use the port defined..."); 
        sendsocket=new DatagramSocket(portOut);
           receivesocket=new DatagramSocket(portIn);
           textArea1.append("\n connection builded.");
      }
      catch(SocketException se){
         se.printStackTrace() ;
         System.exit(0);
     }
     online = !(sendsocket.isClosed());
    }
     
     
 else
        textArea1.append("\nplease input ports and IP");
        
    }

上面的代码,首先判断,如果没有获得连接,则提示用户,通过online属性来判断系统当前的状态,如果已经连接,则断开连接,然后再建立新的连接,否则直接建立连接。

而监听接受的信息方法为
 public void waitforpackets(){//检测并接受对方发来的消息
    while(true){
        try{
             byte[]array=new byte[100];
              receivepacket=new DatagramPacket(array,array.length );
              receivesocket.receive(receivepacket);//接收
              textArea1.append("\nfrom "+receivepacket.getAddress() +":"+receivepacket.getPort()+" get:");
             byte data[]=receivepacket.getData() ;
              String received=new String(data,0);
              textArea1.append(received);
        }
        catch (IOException se){
                se.printStackTrace() ;
        }
    }
  }
 
DatagrmPacket类的最重要的方法是getdata(),从接收包中取得报文的byte数组编码,然后通过调用receivesocket的receive函数接受消息,然后将接收的报文保存。

而发送的代码为
  String str=textField2.getText();
        if(online){
         if(str.compareTo("")!=0 ){
          
             
             try {
              
                                 
                 textArea1.append("\nto "+textField2.getText() +":"+portOut+" say: "+textField1.getText() );
                 String s=textField1.getText() ;
                 byte data[]=new byte[100];
                 s.getBytes(0,s.length() ,data,0);
                 sendpacket=new DatagramPacket(data,s.length() ,InetAddress.getByName(textField2.getText()),portOut);
                 sendsocket.send(sendpacket);
             }
             catch(IOException exc){
                 exc.printStackTrace() ;
             }
       
DatagramPacket的实例化中,这里的格式是DatagramPacket(byte[] buf,int length,InetAddress addr,int port),从 buf数组取出长度为length长度的数据创建数据包对象,目标是addr地址,port端口

posted on 2006-06-12 19:40  jackyrong的世界  阅读(915)  评论(0编辑  收藏  举报