Java Socket编程实例(二)- UDP基本使用
一.服务端代码:
importjava.io.*;
importjava.net.*;
publicclassUDPEchoServer{
privatestaticfinalintECHOMAX=255;//Maximumsizeofechodatagram
publicstaticvoidmain(String[]args)throwsIOException{
intservPort=5500;//Serverport
DatagramSocketsocket=newDatagramSocket(servPort);
DatagramPacketpacket=newDatagramPacket(newbyte[ECHOMAX],ECHOMAX);
while(true){//Runforever,receivingandechoingdatagrams
socket.receive(packet);//Receivepacketfromclient
System.out.println("Handlingclientat"+packet.getAddress().getHostAddress()+"onport"+packet.getPort());
socket.send(packet);//Sendthesamepacketbacktoclient
packet.setLength(ECHOMAX);//Resetlengthtoavoidshrinkingbuffer
}
/*NOTREACHED*/
}
}
二.客户端代码:
importjava.net.*;
importjava.io.*;
publicclassUDPEchoClientTimeout{
privatestaticfinalintTIMEOUT=3000;//Resendtimeout(milliseconds)
privatestaticfinalintMAXTRIES=5;//Maximumretransmissions
publicstaticvoidmain(String[]args)throwsIOException{
InetAddressserverAddress=InetAddress.getByName("127.0.0.1");//Serveraddress
intservPort=5500;//Serverport
//ConverttheargumentStringtobytesusingthedefaultencoding
byte[]bytesToSend="Hi,World".getBytes();
DatagramSocketsocket=newDatagramSocket();
socket.setSoTimeout(TIMEOUT);//Maximumreceiveblockingtime(milliseconds)
//Sendingpacket
DatagramPacketsendPacket=newDatagramPacket(bytesToSend,bytesToSend.length,serverAddress,servPort);
DatagramPacketreceivePacket=//Receivingpacket
newDatagramPacket(newbyte[bytesToSend.length],bytesToSend.length);
inttries=0;//Packetsmaybelost,sowehavetokeeptrying
booleanreceivedResponse=false;
do{
socket.send(sendPacket);//Sendtheechostring
try{
socket.receive(receivePacket);//Attemptechoreplyreception
if(!receivePacket.getAddress().equals(serverAddress)){//Check
//source
thrownewIOException("Receivedpacketfromanunknownsource");
}
receivedResponse=true;
}catch(InterruptedIOExceptione){//Wedidnotgetanything
tries+=1;
System.out.println("Timedout,"+(MAXTRIES-tries)+"moretries...");
}
}while((!receivedResponse)&&(tries<MAXTRIES));
if(receivedResponse){
System.out.println("Received:"+newString(receivePacket.getData()));
}else{
System.out.println("Noresponse--givingup.");
}
socket.close();
}
}
上述代码的UDP服务端是单线程,一次只能服务一个客户端。
以上就是本文的全部内容,查看更多Java的语法,大家可以关注:《ThinkinginJava中文手册》、《JDK1.7参考手册官方英文版》、《JDK1.6APIjava中文参考手册》、《JDK1.5APIjava中文参考手册》,也希望大家多多支持毛票票。