最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Java8新特性之Collectors.joining()實例詳解

    Java8新特性之Collectors.joining()實例詳解

    在項目中我們常常要對list集合的數(shù)據(jù)做一些字符串拼接/處理等相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于Java8新特性之Collectors.joining()的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot電腦商城項目刪除收貨地址的實現(xiàn)方法

    SpringBoot電腦商城項目刪除收貨地址的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot項目--電腦商城刪除收貨地址功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 細(xì)數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    細(xì)數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    下面小編就為大家?guī)硪黄?xì)數(shù)Java接口的概念、分類及與抽象類的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • SpringBoot整個啟動過程的分析

    SpringBoot整個啟動過程的分析

    今天小編就為大家分享一篇關(guān)于SpringBoot整個啟動過程的分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java責(zé)任鏈模式模板代碼分享

    Java責(zé)任鏈模式模板代碼分享

    這篇文章主要介紹了Java責(zé)任鏈模式模板代碼分享,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 一文解析Java中的方法重寫

    一文解析Java中的方法重寫

    子類繼承父類后,可以在子類中書寫一個與父類同名同參的方法,從而實現(xiàn)對父類中同名同參數(shù)的方法的覆蓋,我們把這一過程叫做方法的重寫。本文將分析一下Java中的方法重寫,感興趣的可以了解一下
    2022-07-07
  • Java獲取中文拼音、中文首字母縮寫和中文首字母的示例

    Java獲取中文拼音、中文首字母縮寫和中文首字母的示例

    本文主要介紹了Java獲取中文拼音、中文首字母縮寫和中文首字母,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • 在Linux上搭建一個Java部署環(huán)境的詳細(xì)步驟

    在Linux上搭建一個Java部署環(huán)境的詳細(xì)步驟

    這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • maven引入本地jar包運行報錯java.lang.NoClassDefFoundError解決

    maven引入本地jar包運行報錯java.lang.NoClassDefFoundError解決

    這篇文章主要為大家介紹了maven引入本地jar包運行報錯java.lang.NoClassDefFoundError解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • SpringBoot實現(xiàn)海量數(shù)據(jù)高效實時搜索功能

    SpringBoot實現(xiàn)海量數(shù)據(jù)高效實時搜索功能

    我們都知道隨著業(yè)務(wù)系統(tǒng)的發(fā)展和使用,數(shù)據(jù)庫存儲的業(yè)務(wù)數(shù)據(jù)量會越來越大,逐漸成為了業(yè)務(wù)系統(tǒng)的瓶頸,本文給大家介紹了Spring Boot業(yè)務(wù)系統(tǒng)如何實現(xiàn)海量數(shù)據(jù)高效實時搜索,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10

最新評論

固原市| 巫溪县| 鹿邑县| 福贡县| 陵川县| 清水河县| 竹北市| 双牌县| 桦南县| 邓州市| 宁河县| 崇礼县| 汉中市| 喜德县| 邻水| 阜南县| 乐平市| 长阳| 大余县| 哈尔滨市| 伊川县| 曲阜市| 阿克| 武宣县| 监利县| 志丹县| 海城市| 英德市| 青神县| 若尔盖县| 芷江| 上蔡县| 花莲县| 霍城县| 浠水县| 乌海市| 新野县| 囊谦县| 常德市| 太白县| 扶绥县|