当前位置: 首页 > news >正文

TCP通信——端口转发(重点内容)

实现多人群聊

Client(客户端)建立通信

package com.zz.tcp.case1;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String args[]) throws Exception {//1.创建Socket对象,并同时请求与服务端程序连接Socket socket = new Socket("127.0.0.1", 8888);//创建一个独立的线程,负责随机从socket中接收服务端的发送过来的消息new ClientReaderThread(socket).start();//2.从socket通信管道中的到一个字节输出流,用来发送数据OutputStream os = socket.getOutputStream();//将低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while(true){System.out.println("请说:");String msg = sc.nextLine();//一旦用户输入了exit就退出客户端程序if("exit".equals(msg)){System.out.println("欢迎您下次光临!");dos.close();socket.close();break;}//4.开始写数据出去dos.writeUTF(msg);//5.刷新数据,防止数据留在管道dos.flush();}}
}

ClientReaderThread(服务端线程类)——实现接收服务端转发的消息

package com.zz.tcp.case1;import java.io.*;
import java.net.Socket;public class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {try {String msg = dis.readUTF();System.out.println(msg);//把这个消息发送给全部客户端进行接收sendMsgToAll(msg);} catch (Exception e) {System.out.println("自己下线了" + socket.getRemoteSocketAddress());dis.close();socket.close();break;}}} catch (IOException e) {e.printStackTrace();}}private void sendMsgToAll(String msg) throws IOException {//发送给全部在线的socket的管道接收for (Socket onLineSocket: Server.onLineSockets) {OutputStream os = onLineSocket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}

Server(服务端)负责接收客户端的消息,通过8888端口建立连接

package com.zz.tcp.case1;import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {public static List<Socket> onLineSockets = new ArrayList <>();public static void main(String args[]) throws Exception{System.out.println("========服务端启动========");//1.创建ServerSocket的对象,调用一个accept方法,等待客户端的连接请求ServerSocket serverSocket = new ServerSocket(8888);while (true){//2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求Socket socket = serverSocket.accept();onLineSockets.add(socket);System.out.println("有人上线了" + socket.getRemoteSocketAddress());//3.把这个客户端对应的socket通信管道,交给一个独立的线程复制处理new ServerReaderThread(socket).start();}}
}

ServerReaderThread(客户端线程类)——负责接受客户端发的消息,然后转发给其他客户端

package com.zz.tcp.case1;import java.io.*;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {try {String msg = dis.readUTF();System.out.println(msg);//把这个消息发送给全部客户端进行接收sendMsgToAll(msg);} catch (Exception e) {System.out.println("有人下线了" + socket.getRemoteSocketAddress());Server.onLineSockets.remove(socket);dis.close();socket.close();break;}}} catch (IOException e) {e.printStackTrace();}}private void sendMsgToAll(String msg) throws IOException {//发送给全部在线的socket的管道接收for (Socket onLineSocket: Server.onLineSockets) {OutputStream os = onLineSocket.getOutputStream();DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(msg);dos.flush();}}
}

http://www.lryc.cn/news/329163.html

相关文章:

  • 乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)
  • 批量删除 rabbitmq中随机队列
  • docker 数据卷
  • 【开发工具】Ubuntu复制CSDN代码多余符号的去除
  • 【微服务篇】深入理解微服务注册中心与配置中心
  • 数据库安全(redis、couchdb、h2database)CVE复现
  • 道可云元宇宙每日资讯|元宇宙标准化工作组成立大会召开
  • 20240322-2-Catboost面试题
  • 【PSINS工具箱】EKF与UKF滤波
  • UOS部署oceanbase
  • Hive查询转换与Hadoop生态系统引擎与优势
  • WPF上使用MaterialDesign框架---下载与配置
  • 鸿蒙ARKTS--简易的购物网站
  • LabVIEW转动设备故障诊断系统
  • uniapp h5 touch事件踩坑记录
  • webpack.prod.js(webpack生产环境配置文件)
  • 利用python做模拟数据(测试数据),连接数据库和服务器接口,涉及雪花id服务
  • 大模型日报2024-03-30
  • 【ARM 嵌入式 C 入门及渐进 14 -- C 代码中取余与取模的使用介绍】
  • C++入门知识详细讲解
  • pytorch中的torch.hub.load():以vggish为例
  • mysql 用户管理-权限管理
  • RabbitMQ--04--发布订阅模式 (fanout)-案例
  • 基于java+SpringBoot+Vue的网上书城管理系统设计与实现
  • PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)
  • 通过WSL在阿里云上部署Vue项目
  • 240330-大模型资源-使用教程-部署方式-部分笔记
  • uni-app 富文本编辑器
  • 3D汽车模型线上三维互动展示提供视觉盛宴
  • 如何在Flutter中进行网络请求?