TCP及UDP协议
TCP/IP协议族
七层网络模型及其对应的TCP/IP协议
TCP与UDP对比
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,提供可靠的字节流服务 ,它提供的服务包括**数据流传送、可靠性、**有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。
TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
TCP类似打电话 ,双方需要建立稳定的连接;UDP则是发短信、发邮件,不需要对方和自己建立稳定连接。
Java类实现
Java关于网络的类都封装在java.net中。
Java实现TCP协议
java服务器端:
-
建立服务连接地址
-
读取客户端消息
- 阻塞式监听
- 获取客户端输入
- 使用管道流(或普通输出流)写入客户端消息
-
关闭资源
-
代码示例
//模拟发消息场景 public static void tcpMsg() { try { // 1.创建地址 ServerSocket socket = new ServerSocket(8888); // 2.监听、等待客户端连接 Socket accept = socket.accept();//阻塞式监听 // 3.接收、写入客户端消息 InputStream in = accept.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream();//管道流 byte[] buffer = new byte[124]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); String s = new String(buffer, 0, buffer.length); System.out.println(s); System.out.println(out.toString()); } //关闭资源FILO out.close(); in.close(); accept.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } //接收客户端文件 public static void tcpFile() { try { // 1.创建服务器端口 ServerSocket socket = new ServerSocket(8989); // 2.等待客户端连接 Socket accept = socket.accept(); // 3.创建输出文件 FileOutputStream out = new FileOutputStream("cc.md"); // 4.获取客户端消息,并写入文件 InputStream input = accept.getInputStream(); byte[] buffer = new byte[1024]; int len; while ((len = input.read(buffer)) != -1) { out.write(buffer, 0, len); } // 5.通知客户端文件接收完毕 OutputStream output = accept.getOutputStream(); output.write("文件接收完毕".getBytes(StandardCharsets.UTF_8)); // 6.关闭资源 output.close(); input.close(); out.close(); accept.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }
java客户端:
- 获取服务器连接地址
- 发送消息
- 输出流
- 文件输出流
- 关闭资源
- 代码示例
//向服务器发消息
public static void tcpMsg() {
try {
// 1.获取服务器地址,端口号
InetAddress ip = InetAddress.getByName("127.0.0.1");
int port = 8888;
// 2.创建socket连接
Socket socket = new Socket(ip, port);
// 3.发送消息
OutputStream out = socket.getOutputStream();
out.write("欢迎来到世界".getBytes());
// 4.关闭资源
out.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 向服务器发送文件
public static void tcpFile() {
try {
// 1.获取服务器地址和端口号,创建连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8989);
// 2.文件输入
FileInputStream input = new FileInputStream("D:\\javablog\\Java反射.md");
// 3.消息发出
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) != -1) {
out.write(buffer, 0, buffer.length);
}
// 4.通知文件输出结束了
socket.shutdownOutput();
// 5.确定服务器已经收到文件
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
InputStream in = socket.getInputStream();
byte[] buffer1 = new byte[1024];
while ((len=in.read(buffer1))!=-1){
outputStream.write(buffer1,0,buffer1.length);
System.out.println(outputStream.toString());
}
// 6.关闭资源
in.close();
outputStream.close();
out.close();
input.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Java实现UDP协议
- 发送端
-
创建socket连接
-
创建包
-
发送包
-
关闭资源
-
代码示例
public static void udpSendmsg() { //1.创建socket连接 try { DatagramSocket socket = new DatagramSocket(); //2.读取控制台消息 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String s = null; while (true) { s = reader.readLine(); byte[] msg = s.getBytes(StandardCharsets.UTF_8); //3.发送包 InetAddress ip = InetAddress.getByName("127.0.0.1"); int port = 8888; DatagramPacket packet = new DatagramPacket(msg, 0, msg.length, ip, port); socket.send(packet); if (s.equals("bye bye")) break; } //4.关闭资源 reader.close(); socket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
- 接收端
-
创建socket连接
-
接收包
-
关闭资源
-
代码示例
public static void udpRecieveMsg() { try { //1.创建socket连接 int port = 8888; DatagramSocket socket = new DatagramSocket(port); //2.循环接收包 while (true) { byte[] bufer = new byte[1024]; DatagramPacket packet = new DatagramPacket(bufer, 0, bufer.length); socket.receive(packet); String data = new String(packet.getData(), 0, packet.getLength()); System.out.println(data); //如果消息为"bye bye",则退出聊天 if (data.equals("bye bye")) { break; } } //3.关闭资源 socket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }