package org.zhangmeng.test.eg_socket;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/***
* DatagramSocket创建 : DatagramSocket()
* DatagramSocket(int localPort)
* DatagramSocket(int localPort , InetAddress localAddr)
*
* DatagramSocket连接或关闭 : void connect(InetAddress remoteAddr, int remotePort)
* void connect(SocketAddress remoteSockAddr)
* void disconnect()
* void close()
*
* 地址处理 : InetAddress getInetAddress()
* int getPort()
* SocketAddress getRemoteSocketAddress()
* InetAddress getLocalAddress()
* int getLocalPort()
* SocketAddress getLocalSocketAddress()
*
* DatagramSocket发送与接收 : void send(DatagramPacket packet)
* void receive(DatagramPacket packet)
*
* DatagramSocket选项 : int getSoTimeout()
* void setSoTimeout(int timeoutMillis)
*/
public class UDPEchoClientTimeout {
private static final int TIMEOUT = 3000;
private static final int MAXTRIES = 5;
public static void main(String[] args) throws Exception {
InetAddress serverAddress = InetAddress.getByName("localhost"); //服务端地址
byte[] bytesToSend = "hello world".getBytes(); // 待发送的数据,已默认编码将 String 转换为字节
int servPort = 50000; // 端口
//DatagramSocket 实例可以将报文发送给任何UDP套接字。没有指定本地地址和端口号。如果需要可以通过setLocalAddress和setLocalPort方法来显示设置
DatagramSocket socket = new DatagramSocket();
//数据报文套接字的超时时间,控制 receive()方法的最大阻塞时间(毫秒) ,超时时间不是精确的,一般比设置的大些。
socket.setSoTimeout(TIMEOUT); //接收时的最大阻塞时间
//发送的报文,指定3件事:数据,目标地址,端口。 serverAddress可以指定为主机名或者ip。
DatagramPacket sendPacket = new DatagramPacket(bytesToSend, bytesToSend.length,serverAddress,servPort);
//创建一个接收的数据报文。
DatagramPacket receivePacket = new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length);
int tries = 0 ;
boolean receivedResp = false;
do{
//将报文传输到指定的地址和端口
socket.send(sendPacket);
try{
//阻塞等待,知道收到一个数据报文或者超时。
socket.receive(receivePacket);
if(!receivePacket.getAddress().equals(serverAddress)){
throw new IOException("Received packet from an unkown source");
}
receivedResp = true;
}catch(InterruptedIOException e){ //超时没有获取到数据
tries += 1;
System.out.println("Timed out, " + (MAXTRIES - tries) + " more times .");
}
}while((!receivedResp) && (tries < MAXTRIES));
if(receivedResp){
System.out.println("Received: " + new String(receivePacket.getData()));
}else{
System.out.println("No resp --- giving up");
}
//关闭套接字
socket.close();
}
}
http://qu.8684.com/d_1293835
http://qu.8684.com/d_1293838
http://qu.8684.com/d_1293841
http://qu.8684.com/d_1293844
http://qu.8684.com/d_1293847
http://qu.8684.com/d_1293850
http://qu.8684.com/d_1293853
http://qu.8684.com/d_1293856
http://qu.8684.com/d_1293859
http://qu.8684.com/d_1293862
http://qu.8684.com/d_1293865
http://qu.8684.com/d_1293868
http://qu.8684.com/d_1293871
http://qu.8684.com/d_1293874
http://qu.8684.com/d_1293877
http://qu.8684.com/d_1293880
http://qu.8684.com/d_1293883
http://qu.8684.com/d_1293886
http://qu.8684.com/d_1293889
http://qu.8684.com/d_1293892