欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)多人聊天室(含界面)

 更新時間:2022年06月10日 11:02:09   作者:Li~蒙奇  
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)多人聊天室,包含界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java實現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下

先說,記錄本人的學(xué)習(xí)過程,當(dāng)筆記了

多人聊天室分為

1.服務(wù)器

①.while循環(huán) (guanbo) 每連接一個用戶就記錄一個用戶的屬性。
②.定義一個存儲用戶的類( MySocket )
③.接收信息( ServerThread )并發(fā)給每一位用戶不需要再次發(fā)給自己

2.客戶機

①.線程 ( Clithr )接收數(shù)據(jù)添加到文本框。
②.Swing(kefuduang)做界面。

代碼如下:

先客戶機吧簡單點

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ā)送”按鈕可以被點擊

? ? ? ? ? ? ? ? } 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方法
? ? ? ? }
? ? }
}

運行結(jié)果:

先開服務(wù)器,再開客戶端!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java垃圾回收之復(fù)制算法詳解

    Java垃圾回收之復(fù)制算法詳解

    今天小編就為大家分享一篇關(guān)于Java垃圾回收之復(fù)制算法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • SpringBoot feign動態(tài)設(shè)置數(shù)據(jù)源(https請求)

    SpringBoot feign動態(tài)設(shè)置數(shù)據(jù)源(https請求)

    這篇文章主要介紹了SpringBoot如何在運行時feign動態(tài)添加數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08
  • JAVA設(shè)計模式之建造者模式原理與用法詳解

    JAVA設(shè)計模式之建造者模式原理與用法詳解

    這篇文章主要介紹了JAVA設(shè)計模式之建造者模式,簡單說明了建造者模式的原理、組成,并結(jié)合實例形式分析了java建造者模式的定義與用法,需要的朋友可以參考下
    2017-08-08
  • Java?數(shù)據(jù)庫連接池Druid?的介紹

    Java?數(shù)據(jù)庫連接池Druid?的介紹

    這篇文章主要給大家分享的是?Java?數(shù)據(jù)庫連接池Druid?的介紹,Druid是一個JDBC組件,它包括三部分:?DruidDriver?代理Driver,能夠提供基于Filter-Chain模式的插件體系。?DruidDataSource?高效可管理的數(shù)據(jù)庫連接池,下面來看看文中的詳細(xì)內(nèi)容,需要的朋友也可以參考一下
    2021-11-11
  • 手寫Java?LockSupport的示例代碼

    手寫Java?LockSupport的示例代碼

    LockSupport給我們提供了一個非常強大的功能,它是線程阻塞最基本的元語,他可以將一個線程阻塞也可以將一個線程喚醒,因此經(jīng)常在并發(fā)的場景下進(jìn)行使用。本文將用60行代碼實現(xiàn)手寫LockSupport,需要的可以參考一下
    2022-08-08
  • Spring循環(huán)引用失敗問題源碼解析

    Spring循環(huán)引用失敗問題源碼解析

    這篇文章主要為大家介紹了Spring循環(huán)引用失敗問題源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • HashMap和Hashtable的詳細(xì)比較

    HashMap和Hashtable的詳細(xì)比較

    這篇文章主要介紹了HashMap和Hashtable的詳細(xì)比較的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java異常處理實例分析

    Java異常處理實例分析

    這篇文章主要介紹了Java異常處理,實例分析了java異常處理的常見用法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 兩種實現(xiàn)Java類隔離加載的方法

    兩種實現(xiàn)Java類隔離加載的方法

    這篇文章主要介紹了兩種實現(xiàn)Java類隔離加載的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • nacos gateway動態(tài)路由實戰(zhàn)

    nacos gateway動態(tài)路由實戰(zhàn)

    這篇文章主要介紹了nacos gateway動態(tài)路由實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論