怎么使用Java socket通信模拟QQ实现多人聊天室(java,socket,开发技术)

时间:2024-05-04 05:03:44 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一、socket通信基本原理

socket 通信是基于TCP/IP ⽹络层上的⼀种传送⽅式,我们通常把TCP和UDP称为传输层。

怎么使用Java socket通信模拟QQ实现多人聊天室

如上图,在七个层级关系中,我们讲的socket属于传输层,其中UDP是⼀种⾯向⽆连接的传输层协议。UDP不关⼼对端是否真正收到了传送过去的数据。如果需要检查对端是否收到分组数据包,或者对端是否连接到⽹络,则需要在应⽤程序中实现。UDP常⽤在分组数据较少或多播、⼴播通信以及视频通信等多媒体领域。在这⾥我们不进⾏详细讨论,这⾥主要讲解的是基于TCP/IP协议下的socket通信。

socket是基于应⽤服务与TCP/IP通信之间的⼀个抽象,他将TCP/IP协议⾥⾯复杂的通信逻辑进⾏分装,对⽤户来说,只要通过⼀组简单的API就可以实现⽹络的连接。

二、用socket制作一个多人聊天室

对socket通信基本原理明⽩后,那我们就写⼀个最简单的⽰例,制作聊天室。

服务器端Server:

importjava.io.*;importjava.net.*;importjava.util.ArrayList;publicclassServer{publicstaticServerSocketserver_socket;publicstaticArrayList<Socket>socketList=newArrayList<Socket>();publicstaticvoidmain(String[]args){try{server_socket=newServerSocket(5000);while(true){Socketsocket=server_socket.accept();socketList.add(socket);//把sock对象加入sock集合ServerBO_Threadst=newServerBO_Thread(socket,socketList);//初始化多线程st.start();//启动多线程}}catch(Exceptionex){ex.printStackTrace();}finally{try{if(server_socket!=null){server_socket.close();}}catch(Exceptionex){ex.printStackTrace();}}}publicvoidencryptWrite(Stringsrc,DataOutputStreamoutput)throwsIOException{//将一个字符串转化为字符数组//System.out.println(src);char[]char_arr=src.toCharArray();//加密操作for(inti=0;i<char_arr.length;i++){output.writeChar(char_arr[i]+13);}//用作结束标志符output.writeChar(2333);output.flush();}//读取并解密publicStringreadDecrypt(DataInputStreaminput)throwsIOException{Stringrtn="";while(true){intchar_src=input.readChar();if(char_src!=2333){rtn=rtn+(char)(char_src-13);}else{break;}}returnrtn;}}classServerBO_ThreadextendsThread{Socketclient=null;ArrayList<Socket>clients;ServerBO_Thread(Sockets,ArrayList<Socket>ss){//初始化client=s;clients=ss;}publicvoidrun(){DataInputStreaminput=null;DataOutputStreamoutput=null;try{input=newDataInputStream(client.getInputStream());Serverbo=newServer();Stringreceive=null;Stringsend=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(Socketsocket:clients){//遍历socke集合//把读取到的消息发送给各个客户端if(!socket.isClosed()){output=newDataOutputStream(socket.getOutputStream());bo.encryptWrite(send,output);}}}else{//如果有客户端退出for(Socketsocket:clients){//遍历socke集合if(socket!=client){//告诉其他人此人退出聊天室if(!(socket.isClosed())){output=newDataOutputStream(socket.getOutputStream());bo.encryptWrite(param[0]+"已退出聊天室",output);}}}output=newDataOutputStream(client.getOutputStream());bo.encryptWrite("3333",output);//返回信号给要退出的客户端,然后关闭线程client.close();input.close();output.close();}}else{break;}}}catch(Exceptionex){ex.printStackTrace();}}}

客户端:

importjava.io.IOException;importjava.util.Scanner;importjava.net.*;importjava.io.*;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.BufferedWriter;importjava.io.BufferedReader;importjava.io.DataOutputStream;publicclassPeople{//服务端ippublicStringip="127.0.0.1";//服务端端口publicintport=5000;publicDataOutputStreamoutput=null;publicSocketsocket=null;publicDataInputStreaminput=null;publicScannersc=newScanner(System.in);publicStringsend;publicStringreceive;publicStringname;publicStringsd=null;publicstaticvoidmain(String[]aa){Peoplepo=newPeople();po.start();}publicvoidstart(){try{System.out.println("*******欢迎使用匿名聊天室!**********");System.out.println("请输入你将要使用的昵称:");name=sc.nextLine();//获取昵称socket=newSocket(ip,port);output=newDataOutputStream(socket.getOutputStream());input=newDataInputStream(socket.getInputStream());send=name+"&)start";//把昵称发送到server告诉所有人有新成员加入聊天室System.out.println("(如果要退出聊天室请输入“3333”!)");System.out.println("*******成功进入匿名聊天室!**********");System.out.println("");encryptWrite(send,output);Outout=newOut(output,name,input,socket);out.start();//启动发送聊天内容的多线程while(true){Stringreceive=readDecrypt(input);if("3333".equals(receive)){//如果收到“3333”则退出聊天室System.out.println("*******成功退出匿名聊天室!**********");input.close();output.close();socket.close();System.exit(0);}System.out.println(receive);}}catch(Exceptionex){ex.printStackTrace();}finally{try{if(socket!=null)socket.close();input.close();output.close();}catch(Exceptionex){ex.printStackTrace();}}}publicvoidencryptWrite(Stringsrc,DataOutputStreamoutput)throwsIOException{//将一个字符串转化为字符数组char[]char_arr=src.toCharArray();//加密操作for(inti=0;i<char_arr.length;i++){output.writeChar(char_arr[i]+13);}//用作结束标志符output.writeChar(2333);output.flush();}//读取并解密publicStringreadDecrypt(DataInputStreaminput)throwsIOException{Stringrtn="";while(true){intchar_src=input.readChar();if(char_src!=2333){rtn=rtn+(char)(char_src-13);}else{break;}}returnrtn;}}classOutextendsThread{publicDataOutputStreamoutput;publicDataInputStreaminput;publicstaticStringname;publicSocketsocket;publicScannersc=newScanner(System.in);Out(DataOutputStreamot,Stringn,DataInputStreamit,Socketsocket){output=ot;input=it;name=n;}publicvoidrun(){Peoplepo=newPeople();try{while(true){Stringsend=sc.nextLine();//获取用户输入Stringsend2=name+"&"+send;//把聊天内容打包成约定形式po.encryptWrite(send2,output);}}catch(Exceptionex){ex.printStackTrace();}finally{System.out.println("sfef");}}}

三、实现效果

怎么使用Java socket通信模拟QQ实现多人聊天室

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:怎么使用Java socket通信模拟QQ实现多人聊天室的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Docker容器使用方法是什么下一篇:

18 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18