1.UDP编程Server端
因为UDP协议不需要建立连接,它的过程如下。
- 构造DatagramSocket实例,指定本地端口。
- 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacjet中间就包含了通信的内容。
- 通过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客服端的步骤也比较简单
- 构造DatagramSocket实例
- 通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。
- 调用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();
}
}
}