Java實現(xiàn)多人聊天室(含界面)
本文實例為大家分享了Java實現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下
先說,記錄本人的學(xué)習(xí)過程,當(dāng)筆記了
多人聊天室分為
1.服務(wù)器
①.while循環(huán) (guanbo) 每連接一個用戶就記錄一個用戶的屬性。
②.定義一個存儲用戶的類( MySocket )
③.接收信息( ServerThread )并發(fā)給每一位用戶不需要再次發(fā)給自己
2.客戶機(jī)
①.線程 ( Clithr )接收數(shù)據(jù)添加到文本框。
②.Swing(kefuduang)做界面。
代碼如下:
先客戶機(jī)吧簡單點(diǎn)
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.io.*; import java.net.Socket; import java.time.DateTimeException; class CilThr extends Thread{ ? ? Socket socket; ? ? JTextArea ta; ? ? public CilThr(Socket socket,JTextArea ta){//獲取客戶端的socket和文本區(qū)域 ? ? ? ? this.socket=socket; ? ? ? ? this.ta=ta; ? ? } ? ? @Override ? ? public void run() { ? ? ? ? while (true){//一直在接收中 ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? InputStream inputStream=socket.getInputStream();//字節(jié)輸入流 ? ? ? ? ? ? ? ? DataInputStream din=new DataInputStream(inputStream);//數(shù)據(jù)輸入流 ? ? ? ? ? ? ? ? String text=din.readUTF();//獲取輸入的數(shù)據(jù) ? ? ? ? ? ? ? ? ta.append(text);//添加到文本區(qū)域 ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? } } public class kefuduang { ? ? JFrame jf; ? ? JLabel jLabel; ? ? JTextField tf1,tf2; ? ? JButton start,send; ? ? JTextArea ta; ? ? Socket socket=new Socket("localhost",9000);//連接服務(wù)器需要的端口號9000 ? ? public kefuduang() throws IOException { ? ? ? ? jf=new JFrame("客戶端"); ? ? ? ? jLabel=new JLabel("用戶名"); ? ? ? ? tf1=new JTextField(15); ? ? ? ? tf2=new JTextField(35); ? ? ? ? start=new JButton("連接"); ? ? ? ? send=new JButton("發(fā)送"); ? ? ? ? ta=new JTextArea(40,40); ? ? ? ? init();//調(diào)用方法實現(xiàn)界面 ? ? } ? ? public void init(){ ? ? ? ? JPanel jp1=new JPanel(); ? ? ? ? JPanel jp2=new JPanel(); ? ? ? ? JPanel jp3=new JPanel(); ? ? ? ? ta.setEditable(false);//讓文本框不能輸入,只是顯示出來 ? ? ? ? send.setEnabled(false);//設(shè)置發(fā)送按鈕,不能按,因為還沒有連接上服務(wù)器 ? ? ? ? jp1.add(jLabel); ? ? ? ? jp1.add(tf1); ? ? ? ? jp1.add(start); ? ? ? ? jp2.add(ta); ? ? ? ? jp2.add(new JScrollPane(ta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));//設(shè)置文本區(qū)域的滾動條 ? ? ? ? jp3.add(tf2); ? ? ? ? jp3.add(send); ? ? ? ? jf.add(jp1, BorderLayout.NORTH);//設(shè)置布局 ? ? ? ? jf.add(jp2,BorderLayout.CENTER); ? ? ? ? jf.add(jp3,BorderLayout.SOUTH); ? ? ? ? jf.setVisible(true); ? ? ? ? jf.setLocationRelativeTo(null); ? ? ? ? jf.setSize(500,500); ? ? ? ? jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ? ? ? ?? ? ? ? ? handler();//添加按鈕監(jiān)聽 ? ? ? ? new CilThr(socket,ta).start();//接收其他客戶端發(fā)來的信息 ? ? } ? ? private void handler() { ? ? ? ? start.addActionListener(new AbstractAction() {//連接 ? ? ? ? ? ? @Override ? ? ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? ? ? //發(fā)起連接 ? ? ? ? ? ? ? ? String user= tf1.getText();//獲取用戶名 ? ? ? ? ? ? ? ? System.out.println(user+"發(fā)起連接請求"); ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? OutputStream outputStream=socket.getOutputStream();//字節(jié)輸出流 ? ? ? ? ? ? ? ? ? ? DataOutputStream dout=new DataOutputStream(outputStream);//數(shù)據(jù)輸出流 ? ? ? ? ? ? ? ? ? ? dout.writeUTF(user+" 加入聊天");//.writeUTF里的內(nèi)容輸出到文本里 ? ? ? ? ? ? ? ? ? ? ta.append(user+" 加入聊天"+"\n");//添加到顯示的文本區(qū)域 ? ? ? ? ? ? ? ? ? ? send.setEnabled(true);//再設(shè)置“發(fā)送”按鈕可以被點(diǎn)擊 ? ? ? ? ? ? ? ? } catch (IOException ex) { ? ? ? ? ? ? ? ? ? ? ex.printStackTrace(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //接收 ? ? ? ? ? ? } ? ? ? ? }); ? ? ? ? send.addActionListener(new AbstractAction() {//“發(fā)送”按鈕 ? ? ? ? ? ? @Override ? ? ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? OutputStream outputStream=socket.getOutputStream();//字節(jié)輸出流 ? ? ? ? ? ? ? ? ? ? DataOutputStream dout=new DataOutputStream(outputStream);//數(shù)據(jù)輸出流 ? ? ? ? ? ? ? ? ? ? String text=tf2.getText();//獲取待發(fā)送文本框的內(nèi)容 ? ? ? ? ? ? ? ? ? ? dout.writeUTF(text);//輸出到文件 ? ? ? ? ? ? ? ? ? ? ta.append("我說: "+text+"\n");//添加到顯示的文本區(qū)域 ? ? ? ? ? ? ? ? ? ? tf2.setText("");//設(shè)置下一次需要輸入文本框的內(nèi)容為空 ? ? ? ? ? ? ? ? } catch (IOException ex) { ? ? ? ? ? ? ? ? ? ? ex.printStackTrace(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? public static void main(String[] args) throws IOException { ? ? ? ? new kefuduang(); //調(diào)用構(gòu)造方法 出界面 ? ? } }
下面是服務(wù)器:
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Date; class ServerThread extends Thread{ ? ? Socket socket; ? ? ArrayList<MySocket> sockets; ? ? public ServerThread(Socket socket, ArrayList<MySocket> sockets) {//獲取主函數(shù)傳過來的值 ? ? ? ? this.socket=socket; ? ? ? ? this.sockets=sockets; ? ? } ? ? @Override ? ? public void run() { ? ? ? ? while(true){//接收一個用戶的多次發(fā)送信息 ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? InputStream inputStream=socket.getInputStream();//字節(jié)輸入流 ? ? ? ? ? ? ? ? DataInputStream din=new DataInputStream(inputStream);//數(shù)據(jù)輸入流 ? ? ? ? ? ? ? ? String text=din.readUTF();//獲取輸入的信息 ? ? ? ? ? ? ? ? String user="";//設(shè)置當(dāng)前用戶名為空,以防下一次賦值 ? ? ? ? ? ? ? ? for(int i=0;i<sockets.size();i++){//遍歷sockets集合 ? ? ? ? ? ? ? ? ? ? if(socket==sockets.get(i).getSocket()){//判斷當(dāng)前發(fā)放信息的用戶 ? ? ? ? ? ? ? ? ? ? ? ? user=sockets.get(i).getUser();//獲取當(dāng)前發(fā)放信息的用戶名 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? for(int i=0;i<sockets.size();i++){ ? ? ? ? ? ? ? ? ? ? Socket sc=sockets.get(i).getSocket();//獲取每個用戶的socket ? ? ? ? ? ? ? ? ? ? if(sc!=socket){//判斷 不需要自己發(fā)信息給自己 ? ? ? ? ? ? ? ? ? ? ? ? OutputStream outputStream=sc.getOutputStream();//字節(jié)輸出流 ? ? ? ? ? ? ? ? ? ? ? ? DataOutputStream dout=new DataOutputStream(outputStream);//數(shù)據(jù)輸出流 ? ? ? ? ? ? ? ? ? ? ? ? dout.writeUTF(user+":"+text+"\n");//把當(dāng)前客戶端的名字和信息發(fā)送給除自己以外的其他客戶端 ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? } } class MySocket{//把每一臺客戶端的socket 和用戶名聯(lián)系起來 ? ?private Socket socket;//客戶端的socket ? ?private String user;//客戶名 ? ? public MySocket(Socket socket, String user) { ? ? ? ? this.socket=socket; ? ? ? ? this.user=user; ? ? } ? ? public Socket getSocket() { ? ? ? ? return socket; ? ? } ? ? public void setSocket(Socket socket) { ? ? ? ? this.socket = socket; ? ? } ? ? public String getUser() { ? ? ? ? return user; ? ? } ? ? public void setUser(String user) { ? ? ? ? this.user = user; ? ? } } public class guanbo { ? ? static ArrayList<MySocket> sockets=new ArrayList<MySocket>();//定義一個靜態(tài)的集合里面的類型是class類 MySocket ? ? public static void main(String[] args) throws IOException { ? ? ? ? ServerSocket ss=new ServerSocket(9000);//服務(wù)器的端口號為9000 ? ? ? ? System.out.println("服務(wù)器準(zhǔn)備就緒"); ? ? ? ? while(true){//收集每一次客戶端的連接 ? ? ? ? ? ? Socket socket=ss.accept(); ? ? ? ? ? ? System.out.println("響應(yīng)請求"); ? ? ? ? ? ? //每響應(yīng)一個客戶端就產(chǎn)生一個myscokcet ? ? ? ? ? ? InputStream inputStream=socket.getInputStream();//字節(jié)輸入流 ? ? ? ? ? ? DataInputStream din=new DataInputStream(inputStream);//數(shù)據(jù)輸入流 ? ? ? ? ? ? String user=din.readUTF();//獲取客戶端的名稱? ? ? ? ? ? ? user=user.substring(0,user.length()-4);//把客戶端的名字獲取,刪除“加入聊天” ? ? ? ? ? ? MySocket ms=new MySocket(socket,user);//把用戶的名字和socket放到MyScket里 ? ? ? ? ? ? sockets.add(ms);//再添加到集合里,這樣就可以保存每一個客戶端的名字和socket ? ? ? ? ? ? new ServerThread(socket,sockets).start();//啟動線程 把當(dāng)前客戶端的socket和加入到服務(wù)器的所有socket傳到線程通過構(gòu)造器,并開啟線程run方法 ? ? ? ? } ? ? } }
運(yùn)行結(jié)果:
先開服務(wù)器,再開客戶端!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Java和WebSocket實現(xiàn)網(wǎng)頁聊天室實例代碼
- java聊天室的實現(xiàn)代碼
- java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能
- Java基于socket實現(xiàn)簡易聊天室實例
- java實現(xiàn)一個簡單TCPSocket聊天室功能分享
- 基于java編寫局域網(wǎng)多人聊天室
- Java Socket聊天室編程(一)之利用socket實現(xiàn)聊天之消息推送
- Java基于UDP協(xié)議實現(xiàn)簡單的聊天室程序
- Java Socket聊天室編程(二)之利用socket實現(xiàn)單聊聊天室
- 使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室
相關(guān)文章
SpringBoot feign動態(tài)設(shè)置數(shù)據(jù)源(https請求)
這篇文章主要介紹了SpringBoot如何在運(yùn)行時feign動態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-08-08nacos gateway動態(tài)路由實戰(zhàn)
這篇文章主要介紹了nacos gateway動態(tài)路由實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09