2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Java的网络编程【TCP与UDP聊天小程序】

Java的网络编程【TCP与UDP聊天小程序】

时间:2024-05-19 21:49:29

相关推荐

Java的网络编程【TCP与UDP聊天小程序】

Java的网络编程【TCP与UDP聊天小程序】

1. TCP协议

1.1 传输控制协议(Transmission Control Protocol),是一种**面向连接(全程保持连接)**的协议,类似于打电话。

建立连接 => 进行通信 => 断开连接

在传输前采用"三次握手"方式。

在通信的整个过程中全程保持连接,形成数据传输通道。

保证了数据传输的可靠性和有序性。

是一种全双工字节流通信方式,可以进行大数据量的传输。

传输完毕后需要释放已建立的连接,发送数据的效率比较低。

1.2 下面是C/S 架构的 TCP Java聊天小程序

1.2.1 TCPServer 服务端程序

每当有一个客户端来连接 服务端的时候,我们都会同客户端进行通信,为了将代码的可复用性以及对应的服务功能模块化,我们会将服务模块抽取出来,以线程形式进行服务,而 服务端只是提供了 accept 的阻塞状态,等待客户端的连接

package com.lagou.tcpCSTest;import java.io.IOException;import .ServerSocket;import .Socket;/*** @author 云梦归遥* @date /4/8 19:57* @description*/public class TCPServer {public static void main(String[] args) {ServerSocket serverSocket = null;try {serverSocket = new ServerSocket(8888);System.out.println("============ 服务端初始化成功 ============");while (true){Socket socket = serverSocket.accept();System.out.println("客户端连接成功:【" + socket.getInetAddress() + ":" + socket.getPort() + "】");// 服务端开启线程,服务客户端new ServerThread(socket).start();}} catch (IOException e) {e.printStackTrace();} finally {try {if (serverSocket != null){serverSocket.close();}} catch (IOException e) {e.printStackTrace();}}}}

1.2.2 服务模块抽取出来,以线程形式进行服务

这是 服务端的线程模块,每当有一个客户端进行连接,服务端就会开启一个线程进行服务此处实现多线程的方式 是 继承 Thread类,重写 run 方法

package com.lagou.tcpCSTest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .Socket;/*** @author 云梦归遥* @date /4/8 20:00* @description*/public class ServerThread extends Thread {private Socket socket = null;public ServerThread(Socket socket){this.socket = socket;}@Overridepublic void run(){BufferedReader bufferedReader = null;PrintStream printStream = null;try {bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));printStream = new PrintStream(socket.getOutputStream());System.out.println("服务端为服务客户端开启线程:" + Thread.currentThread().getName());while (true){String msg = bufferedReader.readLine();System.out.println("【客户端】" + msg);printStream.println("接收客户端消息成功");System.out.println("【服务端】接收客户端消息成功");if ("bye".equalsIgnoreCase(msg)){System.out.println("【" + socket.getInetAddress() + ":" + socket.getPort() + "】主动断开连接");break;}}} catch (IOException e) {e.printStackTrace();} finally {try {if (bufferedReader != null){bufferedReader.close();}if (printStream != null){printStream.close();}if (socket != null){socket.close();}} catch (IOException e) {e.printStackTrace();}}}}

1.2.3 客户端代码

package com.lagou.tcpCSTest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .Socket;import java.util.Scanner;/*** @author 云梦归遥* @date /4/8 20:19* @description*/public class TCPClient {public static void main(String[] args) {Socket socket = null;Scanner scanner = new Scanner(System.in);BufferedReader bufferedReader = null;PrintStream printStream = null;try {socket = new Socket("127.0.0.1", 8888);bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));printStream = new PrintStream(socket.getOutputStream());while (true){System.out.println("============= 客户端连接服务端成功 =============");System.out.println("客户端请输入内容:");String nextLine = scanner.nextLine();System.out.println("【客户端】" + nextLine);printStream.println(nextLine);if ("bye".equalsIgnoreCase(nextLine)){break;}try {String readLine = bufferedReader.readLine();System.out.println("【服务端】" + readLine);} catch (IOException e) {e.printStackTrace();}}} catch (IOException e) {e.printStackTrace();} finally {try {if (printStream != null){printStream.close();}if (bufferedReader != null){bufferedReader.close();}if (socket != null){socket.close();}if (scanner != null){scanner.close();}} catch (IOException e) {e.printStackTrace();}}}}

1.3 TCP 聊天小程序的测试

接下来我将使用 IDEA 进行运行代码首先运行 服务端,即 TCPServer(ServerThread不用管,当有客户端来连接的时候服务端会自动开启一个线程进行服务)然后运行 客户端,即 TCPClient

2.UDP 协议

2.1 用户数据报协议(User Datagram Protocol),是一种非面向连接的协议,类似于写信。

在通信的整个过程中不需要保持连接,其实是不需要建立连接。

不保证数据传输的可靠性和有序性。

是一种全双工数据报通信方式,每个数据报的大小限制在64K内。

发送数据完毕后无需释放资源,开销小,发送数据的效率比较高,速度快。

2.2 下面是UDP的 Java聊天小程序

2.2.1 UDP发送消息端

package com.lagou.udpTest;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import java.util.Scanner;/*** @author 云梦归遥* @date /4/8 21:05* @description*/public class UDPSend {public static void main(String[] args) {DatagramSocket datagramSocket = null;DatagramPacket datagramPacket = null;try {datagramSocket = new DatagramSocket();Scanner scanner = new Scanner(System.in);while (true){System.out.println("请输入要发送的内容:");String nextLine = scanner.nextLine();System.out.println("【发送内容】" + nextLine);byte[] byteArray = nextLine.getBytes();datagramPacket = new DatagramPacket(byteArray, byteArray.length, InetAddress.getLocalHost(), 9999);try {datagramSocket.send(datagramPacket);} catch (IOException e) {e.printStackTrace();}if ("stop".equalsIgnoreCase(nextLine)){Thread.sleep(3000);byteArray = new byte[1024];datagramPacket = new DatagramPacket(byteArray, byteArray.length);datagramSocket.receive(datagramPacket);String receiveMSG = new String(byteArray, 0, byteArray.length);System.out.println("【接收方】" + receiveMSG.trim());System.out.println("【发送方】信息发送终止");break;}}} catch (Exception e) {e.printStackTrace();} finally {if(datagramSocket != null){datagramSocket.close();}}}}

2.2.2 接收消息端

package com.lagou.udpTest;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;/*** @author 云梦归遥* @date /4/8 21:23* @description*/public class UDPReceive {public static void main(String[] args) {DatagramSocket datagramSocket = null;DatagramPacket datagramPacket = null;try {datagramSocket = new DatagramSocket(9999);System.out.println("UDP 连接建立成功");while (true){byte[] byteArray = new byte[1024];datagramPacket = new DatagramPacket(byteArray, byteArray.length);try {datagramSocket.receive(datagramPacket);String receiveMSG = new String(byteArray, 0, byteArray.length);receiveMSG = receiveMSG.trim();System.out.println("【接收信息】" + receiveMSG);if ("stop".equalsIgnoreCase(receiveMSG)){byteArray = "接收方收到,即将断开连接".getBytes();datagramPacket = new DatagramPacket(byteArray, byteArray.length, datagramPacket.getAddress(), datagramPacket.getPort());datagramSocket.send(datagramPacket);break;}} catch (IOException e) {e.printStackTrace();}}} catch (Exception e) {e.printStackTrace();} finally {if (datagramSocket != null){datagramSocket.close();}}}}

2.3 进行测试 UDP聊天小程序

首先启动 UDP 发送消息端然后启动 UDP 接收消息端然后发送消息端进行消息的输入,进行发送,接收端就会接收到信息

3,总结

以上就是 TCP 和 UDP 两种网络传输协议下的 Java 聊天小程序,如果有不足之处,请各位多多指教,如果有好的改造的点子,请给我留言,我会继续进行实现 和 完善,谢谢各位 程序员大佬。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。