Java|Java socket通信模拟QQ实现多人聊天室
目录
- 一、socket通信基本原理
- 二、用socket制作一个多人聊天室
- 三、实现效果
- 四、总结
一、socket通信基本原理 socket 通信是基于TCP/IP ?络层上的?种传送?式,我们通常把TCP和UDP称为传输层。
文章图片
?
【Java|Java socket通信模拟QQ实现多人聊天室】如上图,在七个层级关系中,我们讲的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 socketList=new ArrayList(); 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
客户端:
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{//服务端ippublicString ip = "127.0.0.1"; //服务端端口publicint port = 5000; publicDataOutputStream output = null; publicSocket socket = null; publicDataInputStream input = null; publicScanner sc =new Scanner (System.in); publicString send ; publicString receive; publicString 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
三、实现效果
文章图片
?
四、总结 1、用于接收信息的字符串每次都要重新定义一个,不能在开头只定义一次,这样会导致数组角标异常的错误,因为每次接收到的信息的长度都不一样的,所以每次用都要重新new一个字符串。
2、调用多线程的时候一定要把socket或者inputoutput参数传递给构造函数初始化,不能用类.output的形式调用,不然会有空指针的错误(原因大概是直接调用的可能是还没初始化的)。
3、为了程序的健壮性,我们需要对当有客户端退出聊天室的情况进行处理,如果不处理,当有人强制退出聊天室时会导致服务端崩溃发生空指针异常。在这个程序主中我约定用“3333”为退出信息,当客户端发出3333时即退出聊天室,关闭对应socket,此处关键点是要理清谁先关闭谁后关闭,不然也会导致socket崩溃,流程应该是发送3333告知服务器端我要退出了,然后服务器返回信号给客户端我已知晓,你可以退出了,然后客户端服务器端才可以关闭socket。?
到此这篇关于Java socket通信模拟QQ实现多人聊天室的文章就介绍到这了,更多相关Java聊天室内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- java|Vue 2.7 正式发布,代号为 Naruto
- java常见log日志的使用方法解析
- Java中数组容器(ArrayList)设的计与实现
- Java|Java ArrayList与LinkedList及HashMap容器的用法区别
- java|java 异步缓存_为什么redis在java是同步缓存,而在nodejs是异步缓存()
- JavaSE|【Java小游戏】俄罗斯方块
- JavaSE|【JavaSE】数组
- Javaweb基础入门HTML之table与form
- javascript|HarmonyOS应用开发(目录、基本规则、创建项目)
- 2022-07-15|2022-07-15 第六组 润土 Java03数据结构学习笔记