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中文参考手册》,也希望大家多多支持毛票票。