怎么使用Java socket通信模拟QQ实现多人聊天室
来源:亿速云
2024-04-30 17:57:30
0浏览
收藏
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个文章开发实战,手把手教大家学习《怎么使用Java socket通信模拟QQ实现多人聊天室》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
一、socket通信基本原理
socket 通信是基于TCP/IP ⽹络层上的⼀种传送⽅式,我们通常把TCP和UDP称为传输层。
如上图,在七个层级关系中,我们讲的socket属于传输层,其中UDP是⼀种⾯向⽆连接的传输层协议。UDP不关⼼对端是否真正收到了传送过去的数据。如果需要检查对端是否收到分组数据包,或者对端是否连接到⽹络,则需要在应⽤程序中实现。UDP常⽤在分组数据较少或多播、⼴播通信以及视频通信等多媒体领域。在这⾥我们不进⾏详细讨论,这⾥主要讲解的是基于TCP/IP协议下的socket通信。
socket是基于应⽤服务与TCP/IP通信之间的⼀个抽象,他将TCP/IP协议⾥⾯复杂的通信逻辑进⾏分装,对⽤户来说,只要通过⼀组简单的API就可以实现⽹络的连接。
二、用socket制作一个多人聊天室
对socket通信基本原理明⽩后,那我们就写⼀个最简单的⽰例,制作聊天室。
服务器端Server:
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{ //服务端ip public 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"); } } }
三、实现效果
以上就是《怎么使用Java socket通信模拟QQ实现多人聊天室》的详细内容,更多关于java,socket的资料请关注golang学习网公众号!
版本声明
本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除

- 上一篇
- 长安启源A05/Q05迎来首次OTA升级,智能化与舒适性全面提升

- 下一篇
- golang中使用gorm连接Oracle数据库
查看更多
最新文章
-
- 文章 · java教程 | 8小时前 |
- 生成n个总和为100的递减数字序列算法教程标题建议:n个递减数总和为100的算法教程
- 238浏览 收藏
-
- 文章 · java教程 | 8小时前 | 错误处理 jackson ObjectMapper JavaJSON解析 POJO
- Java解析JSON数据方法详解
- 388浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java大文件读写优化技巧分享
- 345浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java编译优化:JIT工作原理与调优技巧
- 235浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java多线程卡死解决与死锁预防技巧
- 202浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java点云处理教程:PCL库集成指南
- 256浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java非C语言开发,技术解析详解
- 382浏览 收藏
-
- 文章 · java教程 | 8小时前 | Java异常处理 try-with-resources 异常类型 自定义异常 try-catch-finally
- Java异常处理技巧:运行时异常应对方法
- 255浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- Java操作JSON,org.json库入门指南
- 489浏览 收藏
-
- 文章 · java教程 | 8小时前 |
- 装饰器模式内部方法调用解析与替代方案
- 404浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
查看更多
AI推荐
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 151次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 143次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 158次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 153次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 160次使用
查看更多
相关文章
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览