Java中UDP编程

1.UDP编程Server端

	因为UDP协议不需要建立连接,它的过程如下。
  1. 构造DatagramSocket实例,指定本地端口。
  2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacjet中间就包含了通信的内容。
  3. 通过DatagramSocket的send和receive方法来收和发DatagramPcket。
	典型的交互流程代码如下
 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * DUP编程之Server端
 */
public class Server {
	public static void main(String[] args) {
		try {
			// 1.构建DatagramSocket实例,指定本地端口
			DatagramSocket socket = new DatagramSocket(10000);
			byte[] buf = new byte[1024];
			// 2.构建需要收发的DatagramPacket报文--构造 DatagramPacket,用来接收长度为 length 的数据包。
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			while (true) {
				// 收报文---从此套接字接收数据报包,此方法在接收到数据报前一直阻塞
				socket.receive(packet);
				System.out
						.println("ip:" + packet.getAddress().getHostAddress());
				// 接收信息
				String receive = new String(packet.getData(),
						packet.getLength());
				System.out.println("接收信息" + receive);
				// 发报文
				String info = receive + "您好!";
				// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
				DatagramPacket dp = new DatagramPacket(info.getBytes(),
						info.getBytes().length, packet.getAddress(), 10000);
				// 为此包设置数据缓冲区。将此 DatagramPacket 的偏移量设置为 0,长度设置为 buf 的长度
				dp.setData(info.getBytes());
				// 从此套接字发送数据报包
				socket.send(dp);
			}
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2.UDP编程客服端

UDP客服端的步骤也比较简单
  1. 构造DatagramSocket实例
  2. 通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
  3. 调用DatagramSocket的close方法关闭。
	因为和TCP不同,UDP发送报文时可以在同一个本地端口随意发送给不同的服务器,一般不需要再UDP的DatagramSocket的构造函数中指定目的服务器的地址。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) {

		try {
			// 客服端建立连接,ip地址是本地,端口号是10000
			Socket s = new Socket("localhost", 10000);
			// 建立输出流,目的是为了向服务器端写数据
			PrintStream out = new PrintStream(s.getOutputStream());
			// 建立输出流,目的是为了向服务器端读取数据
			BufferedReader in = new BufferedReader(new InputStreamReader(
					s.getInputStream()));
			// 从键盘写东西
			Scanner scan = new Scanner(System.in);
			while (true) {
				System.out.println("请输入:");
				String str = scan.nextLine();
				// 写数据
				out.println(str);
				// 读数据
				String line = in.readLine();
				System.out.println(line);
				scan.close();
				s.close();
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
























你可能感兴趣的:(J2SE(java基础部分))