TCP单聊和UDP群聊

TCP协议单聊

服务端:

import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class fuwuchuangkou extends JFrame {private JTextArea ta_info;private ServerSocket server; // 声明ServerSocket对象private Socket socket; // 声明Socket对象socketprivate Vector<Socket> vector = new Vector<Socket>();// 用于存储连接到服务器的客户端套接字对象public void createSocket() {try {server = new ServerSocket(1978);while (true) {ta_info.append("等待新客户连接......\n");socket = server.accept();// 创建套接字对象vector.add(socket);// 将套接字对象添加到向量对象中ta_info.append("客户端连接成功。" + socket + "\n");new ServerThread(socket).start();// 创建并启动线程对象}} catch (IOException e) {e.printStackTrace();}}class ServerThread extends Thread {Socket socket;public ServerThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息for (Socket s : vector) {// 遍历所有客户端套接字对象if (s != socket) {// 如果不是发送信息的套接字对象PrintWriter out = new PrintWriter(s.getOutputStream(), true);// 创建输出流对象out.println(info);// 发送信息out.flush();// 刷新输出缓冲区}}}} catch (IOException e) {ta_info.append(socket + "已经退出。\n");vector.remove(socket);// 移除退出的客户端套接字}}}public static void main(String args[]) {fuwuchuangkou frame = new fuwuchuangkou();frame.setVisible(true);frame.createSocket();}/*** Create the frame*/public fuwuchuangkou() {super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}
}

 客户端:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehuchuangkou extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 声明输出流对象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 连接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 创建输出流对象new ClientThread(socket).start();// 创建并启动线程对象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息ta_info.append(info + "\n");// 在文本域中显示信息if (info.equals("88")) {break;// 结束线程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 获得输入的信息if (info.equals("")) {return;// 如果没输入信息则返回,即不发送}if (info.equals("88")) {System.exit(0);// 如果没输入信息是88,则退出}out.println(info);// 发送信息out.flush();// 刷新输出缓冲区tf_send.setText(null);// 清空文本框}public kehuchuangkou() {  //创建面板super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("输入聊天内容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("发  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehu1 extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 声明输出流对象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 连接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 创建输出流对象new ClientThread(socket).start();// 创建并启动线程对象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息ta_info.append(info + "\n");// 在文本域中显示信息if (info.equals("88")) {break;// 结束线程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 获得输入的信息if (info.equals("")) {return;// 如果没输入信息则返回,即不发送}if (info.equals("88")) {System.exit(0);// 如果没输入信息是88,则退出}out.println(info);// 发送信息out.flush();// 刷新输出缓冲区tf_send.setText(null);// 清空文本框}public kehu1() {  //创建面板super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("输入聊天内容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("发  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}

结果:

UDP协议群聊

服务端:

import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketList=new ArrayList<Socket>();  public static void main(String []args){try{server_socket = new ServerSocket(5000);while(true){Socket socket = server_socket.accept();socketList.add(socket); //把sock对象加入sock集合ServerBO_Thread st=new ServerBO_Thread(socket,socketList); //初始化多线程st.start();//启动多线程}}catch(Exception ex){ex.printStackTrace();}finally{try{if(server_socket!=null){server_socket.close();}}catch(Exception ex){ex.printStackTrace();}}}public void encryptWrite(String src,DataOutputStream output)throws IOException{//将一个字符串转化为字符数组//System.out.println(src);char[] char_arr = src.toCharArray();//加密操作for(int i = 0;i<char_arr.length;i++){output.writeChar(char_arr[i]+13);}//用作结束标志符output.writeChar(2333);output.flush();}//读取并解密public String readDecrypt(DataInputStream input)throws IOException{String rtn="";while(true){int char_src =input.readChar();if(char_src!=2333){rtn=rtn+(char)(char_src-13);}else{break;}}return rtn;}
}
class ServerBO_Thread extends Thread{Socket client = null;ArrayList<Socket> clients;ServerBO_Thread(Socket s,ArrayList<Socket> ss){//初始化client=s;clients=ss; }public void run(){DataInputStream input = null;DataOutputStream output =null;try{input = new DataInputStream(client.getInputStream());Server bo = new Server();String receive=null;String send=null;while(true){//监视当前客户端有没有发来消息if(!client.isClosed()){receive=bo.readDecrypt(input);clients.trimToSize();String[] param = receive.split("&");if(")start".equals(param[1])){    //分析客户端发来的内容send = param[0]+"进入聊天室";}else{send = param[0]+"说:    "+param[1];}if(!("3333".equals(param[1]))){//3333为退出聊天室信号for(Socket socket:clients){ //遍历socke集合 //把读取到的消息发送给各个客户端  if(!socket.isClosed()){output = new DataOutputStream(socket.getOutputStream());bo.encryptWrite(send,output);}}  }else{//如果有客户端退出for(Socket socket:clients){ //遍历socke集合 if(socket!=client){//告诉其他人此人退出聊天室if(!(socket.isClosed())){output = new DataOutputStream(socket.getOutputStream());bo.encryptWrite(param[0]+"已退出聊天室",output);}}}output = new DataOutputStream(client.getOutputStream());bo.encryptWrite("3333",output);//返回信号给要退出的客户端,然后关闭线程client.close();input.close();output.close();}}else{break;}}}catch(Exception ex){ex.printStackTrace();}}
}

客户端:

import java.io.IOException;
import java.util.Scanner;
import java.net.*;
import java.io.*;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.DataOutputStream;
public class People{
//服务端ippublic  String ip = "127.0.0.1";//服务端端口public  int port = 5000;public  DataOutputStream output = null;public  Socket socket = null;public  DataInputStream input = null;public  Scanner sc =new Scanner (System.in);public  String send ;public  String receive;public  String name;public String sd = null;public static void main(String[]aa){People po = new People();po.start();}public void start(){try{System.out.println("*******欢迎使用匿名聊天室!**********");System.out.println("请输入你将要使用的昵称:");name=sc.nextLine();//获取昵称socket = new Socket(ip,port);output=new DataOutputStream(socket.getOutputStream());input = new DataInputStream(socket.getInputStream());send = name+"&)start";//把昵称发送到server 告诉所有人有新成员加入聊天室System.out.println("(如果要退出聊天室请输入“3333”!)");System.out.println("*******成功进入匿名聊天室!**********");System.out.println("");encryptWrite(send,output);Out out=new Out(output,name,input,socket);out.start();//启动发送聊天内容的多线程while(true){    String receive = readDecrypt(input);if("3333".equals(receive)){//如果收到“3333”则退出聊天室System.out.println("*******成功退出匿名聊天室!**********");input.close();output.close();socket.close();System.exit(0);}System.out.println(receive);}}catch(Exception ex){ex.printStackTrace();}finally{try{if(socket!=null) socket.close();input.close();output.close();}catch(Exception ex){ex.printStackTrace();}}    }public void encryptWrite(String src,DataOutputStream output)throws IOException{//将一个字符串转化为字符数组char[] char_arr = src.toCharArray();//加密操作for(int i = 0;i<char_arr.length;i++){output.writeChar(char_arr[i]+13);}//用作结束标志符output.writeChar(2333);output.flush();}//读取并解密public String readDecrypt(DataInputStream input)throws IOException{String rtn="";while(true){int char_src =input.readChar();if(char_src!=2333){rtn=rtn+(char)(char_src-13);}else{break;}}return rtn;}
}
class Out extends Thread {public DataOutputStream output;public DataInputStream input;public static String name;public Socket socket;public  Scanner sc =new Scanner (System.in);Out(DataOutputStream ot,String n,DataInputStream it,Socket socket){output=ot;input=it;name=n;}public void run(){People po = new People();try{while(true){String send=sc.nextLine();//获取用户输入String send2=name+"&"+send;//把聊天内容打包成约定形式po.encryptWrite(send2,output);}}catch(Exception ex){ex.printStackTrace();}finally{System.out.println("sfef");}}
}

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EG网关串口连接威纶通触摸屏应用案例

EG网关串口连接威纶通触摸屏应用案例 威纶通触摸屏广泛应于工业控制领域&#xff0c;是一款性能高&#xff0c;运行稳定的人机交互设备。此次我们要把威纶通的触摸屏通过Modbus-RTU协议连接EG系列网关&#xff0c;实现电脑Web页面和手机APP对威纶通触摸屏的远程数据采集和读取…

种下一棵栀子花

女孩说自己是男孩当年伸手就可触及的栀子花.男孩沉默了,明白了当初失去了什么. 时光倒流,13年前的一个夏天夜晚,男孩与女孩同在沪城,女孩分享了自己的照片给男孩.男孩站在窗前,那晚的夜空很美丽,仿佛托着那个白衣裳女孩的纯真的梦,来到了自己的身边. 女孩说彼此间只是少了一个深…

11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

大家好&#xff0c;我是 Java陈序员。 俗话说得好&#xff0c;面试造火箭&#xff0c;入职拧螺丝。我们在工作中&#xff0c;其实很少用到一些计算机底层知识&#xff0c;往往只要编码完事。但是&#xff0c;知其然还要知其所以然&#xff0c;我们不仅要做一个合格的“CV 工程…

校园后勤数字化转型要怎么做?的修工单管理系统的功能强大吗?

2023年11月27日-29日&#xff0c;由中国教育后勤协会主办&#xff0c;广东省高校后勤协会、物业管理专业委员会、能源管理专业委员会、安全管理专业委员会、中小学后勤分会等协办的第六届中国教育后勤展览会在深圳圆满落幕。 广东工程宝科技有限公司以其创新的“的修工单管理系…

搜维尔科技:Varjo XR-4 系列-专为极致沉浸感而打造!

Varjo 的新一代头显将世界上最先进的混合现实技术与顶尖的图形处理能力连接起来&#xff0c;满足最高级别的视觉保真度和沉浸感至关重要的工业用例。 光学设计的根本性突破 体验全新的沉浸感。大幅扩展的视野&#xff0c;跨越 120 x 105 度&#xff0c;打破了受人尊敬的“全双眼…

【数据结构】手撕排序

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

解析企业云性能监控几个重要作用

随着企业业务的数字化转型&#xff0c;云计算在企业中的应用越来越广泛。在这个背景下&#xff0c;保障云计算环境的性能和稳定性显得尤为重要。企业云性能监控作为一种有效的管理手段&#xff0c;对于确保云计算系统的顺利运行和业务的高效展开起到了关键作用。以下是企业云性…

彻底解决org.gradle.api.artifacts.DependencySubstitutions

需求背景 最近在使用android studio导入hbuilder的HBuilder-Integrate-AS工程时候报错&#xff0c;错误消息如下两种。 错误描述 第一种 Failed to notify dependency resolution listener. void org.gradle.api.artifacts.DependencySubstitutions$Substitution.with(org.g…

9.68亿美元!2024,美国重金押注量子科技

11月29日&#xff0c;美国众议院科学、空间和技术委员会通过了一项重要法案——《国家量子计划重新授权法案》。这项法案不仅将支持期限延长至2028财年&#xff0c;还将重点放在量子技术在现代场景中的应用上&#xff1b;标志着美国对这一可能定义未来技术格局的科学领域的承诺…

了解linux日志

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的 查看日志的方法 日志中记录了各种各样的问题&#xff0c;所以读取日志是检测并排除故障的一个重要方式&#xff0c;日志文 件默认放在/var/log目录下。不同的问题要读取不同的日志&#xff0c;例如&#xff0c;邮…

好用免费的AI换脸5个工具

在当今社会的发展中&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;扮演着关键的角色&#xff0c;其应用领域不断扩展。作为AI的一个分支&#xff0c;换脸技术近年来备受欢迎。这项技术使得将一个人的面部特征迁移到另一个人的照片或视频成为可能。除…

膜结构建筑:未来体育可持续发展的绿色引擎

随着城市化的飞速发展&#xff0c;现代建筑迫切需要创新性的解决方案&#xff0c;而膜结构建筑以其独特的设计理念和可持续性特点&#xff0c;正在成为未来城市发展的重要引擎。本文将深入探讨膜结构建筑在可持续城市发展中的关键作用&#xff0c;包括其在节能减排、资源有效利…

软著项目推荐 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

探索正则可视化工具:让编程更直观、高效

导语&#xff1a;在当今的编程世界中&#xff0c;正则表达式已成为不可或缺的技能。然而&#xff0c;理解和编写正则表达式往往是一项具有挑战性的任务。为了降低门槛&#xff0c;提高编程效率&#xff0c;正则可视化工具应运而生。 一、正则表达式的简介与历史 正则表达式&a…

Python小案例:while练习题

目录 while练习题&#xff1a;1、存款多少年能翻倍2.小球坠落长度计算3、猴子吃桃4、计算&#xff1a;1-23-4...99-100的和 while练习题&#xff1a; 1、存款多少年能翻倍 1万本金&#xff0c;年利息&#xff1a;0.0325&#xff0c;求连本带息多少年能翻倍 解析&#xff1a;…

AI烟火识别智能视频分析系统解决方案

引言 随着城市化进程的加快和高科技的迅猛发展&#xff0c;传统的消防系统逐渐显露出局限性。在这种背景下&#xff0c;AI烟火识别智慧消防解决方案应运而生&#xff0c;它融合了最新的AI技术&#xff0c;旨在提高火灾的预防、检测、应对和控制能力&#xff0c;保护人民生命财…

mysql的组合查询

mysql的组合查询 1、mysql的内连接查询 在 MySQL 中&#xff0c;内连接&#xff08;INNER JOIN&#xff09;是一种根据两个或多个表之间的匹配条件&#xff0c;将多个表中的数据进行联接的操作。内连接只返回符合联接条件的行&#xff0c;而不会返回未匹配的行。 内连接的语…

C# WPF上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 每到年末或者是尾牙的时候&#xff0c;很多公司都会办一些年终的清楚活动&#xff0c;感谢员工过去一年辛苦的付出。这个时候&#xff0c;作为年会…

二叉树题目:翻转二叉树以匹配前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;翻转二叉树以匹配前序遍历 出处&#xff1a;971. 翻转二叉树以匹配前序遍历 难度 5 级 题目描述 要求 给定一个二叉树的根结点 root \texttt{roo…

单电源、轨到轨输入输出、高精度运放MS8551/8552/8554

产品简述 MS8551/8552/8554 是输入输出轨到轨的高精度运算放大器&#xff0c;它 有极低的输入失调电压和偏置电流&#xff0c;单电源电压范围为 1.8V 到 5V 。 轨到轨的输入输出范围使 MS8551/8552/8554 可以轻松地放大高 电平和低电平的传感信号。所有特性使得 MS8…