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端口