`
wangrui
  • 浏览: 186760 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

网络编程之:UDP客户端

阅读更多
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;

/**
 * UDP客户端
 * 
 */
public class UDPClient {
	// *********常数*********

	private static final int DEFAULT_RECEIVE_BUFFER_SIZE = 8192;
	private static final int DEFAULT_SO_TIMEOUT = 30000;

	// *********成员变量*********

	private SocketAddress serverSocketAddress;
	private byte[] sendData;
	private DatagramPacket output;

	private int receiveBufferSize; // in bytes
	private DatagramSocket ds;

	// *********构造函数*********

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @throws SocketException
	 */
	public UDPClient(String serverAddress, int serverPort) throws SocketException {
		this(serverAddress, serverPort, new byte[1], DEFAULT_RECEIVE_BUFFER_SIZE, DEFAULT_SO_TIMEOUT);
	}

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @param sendData 发送的数据
	 * @throws SocketException
	 */
	public UDPClient(String serverAddress, int serverPort, byte[] sendData) throws SocketException {
		this(serverAddress, serverPort, sendData, DEFAULT_RECEIVE_BUFFER_SIZE, DEFAULT_SO_TIMEOUT);
	}

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @param sendData 发送的数据
	 * @param receiveBufferSize 接收缓存大小
	 * @throws SocketException
	 */
	public UDPClient(String serverAddress, int serverPort, byte[] sendData, int receiveBufferSize)
			throws SocketException {
		this(serverAddress, serverPort, sendData, receiveBufferSize, DEFAULT_SO_TIMEOUT);
	}

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @param sendData 发送的数据
	 * @param receiveBufferSize 接收缓存大小
	 * @param timeout 超时
	 * @throws SocketException
	 */
	public UDPClient(String serverAddress, int serverPort, byte[] sendData, int receiveBufferSize, int timeout)
			throws SocketException {
		SocketAddress sa = new InetSocketAddress(serverAddress, serverPort);
		this.serverSocketAddress = sa;
		this.sendData = sendData;
		this.output = new DatagramPacket(sendData, sendData.length, sa);

		this.receiveBufferSize = receiveBufferSize;
		this.ds = new DatagramSocket(0);
		this.ds.setSoTimeout(timeout);
	}

	// *********成员方法*********

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @param sendData 发送的数据
	 * @param receiveBufferSize 接收缓存大小
	 * @param timeout 超时
	 * @throws SocketException
	 */
	public void setServerSocketAddress(SocketAddress serverSocketAddress) {
		this.serverSocketAddress = serverSocketAddress;
	}

	/**
	 * 
	 * 构建一个UDPClient对象。
	 * 
	 * @param serverAddress 服务地址
	 * @param serverPort 服务器监听端口
	 * @param sendData 发送的数据
	 * @param receiveBufferSize 接收缓存大小
	 * @param timeout 超时
	 * @throws SocketException
	 */
	public void setSendData(byte[] sendData) {
		this.sendData = sendData;
	}

	/**
	 * 发送数据并且接受数据。
	 */
	public byte[] sendAndReceive() throws IOException {
		send();
		return receive();
	}

	/**
	 * 只发送数据。
	 */
	public void send() throws IOException {
		output.setSocketAddress(serverSocketAddress);
		output.setData(sendData);
		output.setLength(sendData.length);

		ds.connect(serverSocketAddress);
		ds.send(output);
	}
	
	/**
	 * 接收数据。
	 */
	public byte[] receive() throws IOException {
		byte[] response = null;
		DatagramPacket input = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize);
		// next line blocks until the response is received
		ds.receive(input);
		int numBytes = input.getLength();
		response = new byte[numBytes];
		System.arraycopy(input.getData(), 0, response, 0, numBytes);

		// may return null
		return response;
	}
	
	/**
	 * 关闭Socket。
	 */
	public void close() {
		this.ds.close();
	}
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics