TCP案例之单聊与群聊

devtools/2024/10/18 14:15:41/

TCP案例之单聊与群聊

一、TCP案例之单聊

在基于TCP协议的单聊应用中,通常涉及客户端和服务器端的交互。

服务器端

  1. 建立服务器
    • 服务器端创建一个TCP Socket并绑定到一个特定的端口,开始监听来自客户端的连接请求。
  2. 接受连接
    • 服务器端接受客户端的连接请求,建立TCP连接。
  3. 接收消息
    • 服务器端接收客户端发送的消息数据。
  4. 处理消息
    • 服务器端处理接收到的消息,可以进行消息转发、存储、验证等操作。
  5. 发送响应
    • 服务器端可以向客户端发送响应,如确认消息接收、错误提示等。

客户端

  1. 建立连接
    • 客户端创建一个TCP Socket并连接到服务器端的IP地址和端口。
  2. 发送消息
    • 客户端向服务器端发送消息数据。
  3. 接收响应
    • 客户端接收服务器端的响应数据。
  4. 处理响应
    • 客户端处理接收到的响应,可以展示在界面上或者进行其他操作。
  5. 关闭连接
    • 客户端和服务器端在通信结束后关闭连接。

示例场景

  • Alice和Bob是两个用户,他们分别运行客户端应用程序。
  • 服务器端监听在特定端口上,等待客户端连接。
  • Alice连接到服务器端,发送一条消息给Bob。
  • 服务器端接收Alice的消息,转发给Bob。
  • Bob接收到消息后可以进行回复,服务器再将消息转发给Alice。

示例代码

客服端

java">import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class Client {/*** 知识点:TCP案例 之 优化单聊*/public static void main(String[] args) throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1", 9082);new ReceiveThread(socket).start();Scanner scan = new Scanner(System.in);PrintStream ps = new PrintStream(socket.getOutputStream());while(true){ps.println("小雷:" + scan.next());}}
}

服务器端

java">import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Server {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(9082);Socket socket = server.accept();new ReceiveThread(socket).start();Scanner scan = new Scanner(System.in);PrintStream ps = new PrintStream(socket.getOutputStream());while(true){ps.println("小杨:" + scan.next());}}
}

接收线程(相当于中转站)

java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;public class ReceiveThread extends Thread{private Socket socket;public ReceiveThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));while(true){String readLine = br.readLine();System.out.println(readLine);}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

二、TCP案例之群聊

基于TCP协议的群聊应用涉及多个客户端与服务器之间的交互,实现了群组内的消息广播功能。

服务器端

  1. 建立服务器
    • 服务器端创建一个TCP Socket并绑定到一个特定的端口,开始监听来自客户端的连接请求。
  2. 接受连接
    • 服务器端接受客户端的连接请求,建立TCP连接。
  3. 加入群组
    • 客户端可以向服务器发送加入群组的请求,服务器更新群组成员列表。
  4. 接收消息
    • 服务器端接收客户端发送的消息数据。
  5. 消息广播
    • 服务器端将接收到的消息广播给所有群组成员。
  6. 处理退出
    • 客户端可以发送退出群组的请求,服务器更新群组成员列表并通知其他成员。

客户端

  1. 建立连接
    • 客户端创建一个TCP Socket并连接到服务器端的IP地址和端口。
  2. 加入群组
    • 客户端向服务器发送加入群组的请求。
  3. 发送消息
    • 客户端向服务器发送消息数据。
  4. 接收广播
    • 客户端接收服务器端广播的消息数据。
  5. 处理消息
    • 客户端展示接收到的消息数据。
  6. 退出群组
    • 客户端可以发送退出群组的请求。

示例场景

  • 服务器端维护一个群组成员列表,包括Alice、Bob、Charlie等用户。
  • Alice、Bob、Charlie分别连接到服务器端,加入群组。
  • Alice发送一条消息给所有群组成员。
  • 服务器端接收Alice的消息,将消息广播给Bob、Charlie等成员。
  • Bob和Charlie接收到消息后可以进行回复或者其他操作。
  • Bob决定退出群组,发送退出请求给服务器端。

示例代码

服务器端

java">import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class Client {/*** 知识点:TCP案例 之 群聊*/public static void main(String[] args) throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1", 7080);new ReceiveThread(socket).start();Scanner scan = new Scanner(System.in);PrintStream ps = new PrintStream(socket.getOutputStream());while(true){ps.println("小杨:" + scan.next());}}
}

服务器端:

java">import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;public class Server {public static final ConcurrentHashMap<String, PrintStream> map = new ConcurrentHashMap<>();public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(7080);while(true){Socket socket = server.accept();String ip = socket.getInetAddress().toString();PrintStream ps = new PrintStream(socket.getOutputStream());map.put(ip, ps);new ServerThread(socket).start();}}
}

服务器线程

java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.Map.Entry;
import java.util.Set;public class ServerThread extends Thread{private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//接受当前客户端的消息BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));while(true){String readLine = br.readLine();System.out.println(readLine);//发送给其他客户端消息Set<Entry<String,PrintStream>> entrySet = Server.map.entrySet();for (Entry<String, PrintStream> entry : entrySet) {String ip = entry.getKey();PrintStream ps = entry.getValue();if(!socket.getInetAddress().toString().equals(ip)){ps.println(readLine);}}}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

接受线程:

java">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;public class ReceiveThread extends Thread{private Socket socket;public ReceiveThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));while(true){String readLine = br.readLine();System.out.println(readLine);}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

TCP群聊理解图
TCP群聊理解图


http://www.ppmy.cn/devtools/28572.html

相关文章

kafka 线上消费积压问题

背景 线上kafka 流量大&#xff0c;消费小于生产&#xff0c;如何处理&#xff1f; 方案 增加consumer数量 可以增加consumer的消费者&#xff0c;不过这个只能在一定程序上缓解&#xff0c;如果consumer 数量超过partition 数&#xff0c;那有的就会空转&#xff0c;解决不…

速盾:高防cdn-为您的网站防御cc/ddos

随着互联网的飞速发展&#xff0c;网站安全问题也日益突出。网站被黑客攻击的事件频频发生&#xff0c;给用户和网站运营商带来了巨大的损失。其中&#xff0c;CC攻击和DDoS攻击是最常见的攻击手段之一。为了有效应对这些攻击&#xff0c;提高网站的安全性&#xff0c;高防CDN成…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法&#xff0c;是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时&#xff0c;它会…

vue集成百度地图vue-baidu-map

文章目录 vue集成百度地图vue-baidu-map1. Vue Baidu Map文档地址2. 设置npm数据源3. 安装vue-baidu-map4. 配置vue-baidu-map4.1 main.js全局注册4.2 vue页面设置4.3 效果 vue集成百度地图vue-baidu-map 1. Vue Baidu Map文档地址 https://dafrok.github.io/vue-baidu-map/#…

【c++】反向迭代器的探究实现

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 在list中我们实现了正向的迭代器&#xff0c;学习完优先级队列后&#xff0c;我们也对适配器模式有了一个深刻的理解&#xff0c;这篇文章基于这种模式下&#xff0c;实现各类容器的反向迭…

Springboot之文件操作记录存储服务

概述 应公司安全管理部门政策要求,需要实现文件上传/下载操作的日志记录,经过分析需要在目前平台上基于springboot搭建一套服务供其他应用具体业务调用,其中该服务涉及到的技术支撑&#xff1a;AOP实现异常处理、queuespring-scheduler异步执行定时任务、Fegin组件进行服务间通…

Quartz.Net技术教学:构建高效的任务调度系统

Quartz.Net技术教学&#xff1a;构建高效的任务调度系统 对于定时任务、后台数据处理等相信也是大家经常遇到的需求啦。为了满足这些需求&#xff0c;Quartz.Net作为一款功能强大的任务调度框架&#xff0c;受到了广大开发者的青睐。本文就从Quartz.Net的基本概念、核心组件、…

图像识别的突破:使用MNIST数据集训练你的首个深度学习模型

引言 在深度学习的世界里&#xff0c;MNIST数据集相当于是“Hello World”程序。它包含了大量的手写数字图像&#xff0c;是初学者学习图像识别和训练神经网络的理想起点。在这篇博客中&#xff0c;我们将结合NVIDIA深度学习DLI基础课程的内容&#xff0c;学习如何使用MNIST数…