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

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

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

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

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

多人聊天室分為

1.服務(wù)器

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

2.客戶機(jī)

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

代碼如下:

先客戶機(jī)吧簡(jiǎn)單點(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ù)器需要的端口號(hào)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)用方法實(shí)現(xiàn)界面
? ? }

? ? public void init(){
? ? ? ? JPanel jp1=new JPanel();
? ? ? ? JPanel jp2=new JPanel();
? ? ? ? JPanel jp3=new JPanel();

? ? ? ? ta.setEditable(false);//讓文本框不能輸入,只是顯示出來(lái)
? ? ? ? send.setEnabled(false);//設(shè)置發(fā)送按鈕,不能按,因?yàn)檫€沒(méi)有連接上服務(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ū)域的滾動(dòng)條

? ? ? ? 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)聽(tīng)
? ? ? ? new CilThr(socket,ta).start();//接收其他客戶端發(fā)來(lái)的信息

? ? }

? ? private void handler() {
? ? ? ? start.addActionListener(new AbstractAction() {//連接
? ? ? ? ? ? @Override
? ? ? ? ? ? public void actionPerformed(ActionEvent e) {
? ? ? ? ? ? ? ? //發(fā)起連接
? ? ? ? ? ? ? ? String user= tf1.getText();//獲取用戶名
? ? ? ? ? ? ? ? System.out.println(user+"發(fā)起連接請(qǐng)求");

? ? ? ? ? ? ? ? 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("我說(shuō): "+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ù)傳過(guò)來(lái)的值
? ? ? ? this.socket=socket;
? ? ? ? this.sockets=sockets;
? ? }

? ? @Override
? ? public void run() {
? ? ? ? while(true){//接收一個(gè)用戶的多次發(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();//獲取每個(gè)用戶的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{//把每一臺(tái)客戶端的socket 和用戶名聯(lián)系起來(lái)
? ?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>();//定義一個(gè)靜態(tài)的集合里面的類型是class類 MySocket

? ? public static void main(String[] args) throws IOException {
? ? ? ? ServerSocket ss=new ServerSocket(9000);//服務(wù)器的端口號(hào)為9000
? ? ? ? System.out.println("服務(wù)器準(zhǔn)備就緒");

? ? ? ? while(true){//收集每一次客戶端的連接
? ? ? ? ? ? Socket socket=ss.accept();
? ? ? ? ? ? System.out.println("響應(yīng)請(qǐng)求");

? ? ? ? ? ? //每響應(yīng)一個(gè)客戶端就產(chǎn)生一個(gè)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);//再添加到集合里,這樣就可以保存每一個(gè)客戶端的名字和socket

? ? ? ? ? ? new ServerThread(socket,sockets).start();//啟動(dòng)線程 把當(dāng)前客戶端的socket和加入到服務(wù)器的所有socket傳到線程通過(guò)構(gòu)造器,并開(kāi)啟線程run方法
? ? ? ? }
? ? }
}

運(yùn)行結(jié)果:

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

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

相關(guān)文章

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

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

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

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

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

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

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

    SpringBoot整個(gè)啟動(dòng)過(guò)程的分析

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

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

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

    一文解析Java中的方法重寫(xiě)

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

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

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

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

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

    maven引入本地jar包運(yùn)行報(bào)錯(cuò)java.lang.NoClassDefFoundError解決

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

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

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

最新評(píng)論

虞城县| 农安县| 永州市| 武定县| 乌鲁木齐县| 阳江市| 越西县| 望江县| 东海县| 曲周县| 丰都县| 临江市| 贞丰县| 霍邱县| 赤水市| 桐庐县| 晴隆县| 天气| 青川县| 南通市| 蒲城县| 永修县| 饶阳县| 河南省| 石棉县| 苗栗县| 泌阳县| 旅游| 磐石市| 兴山县| 习水县| 聂荣县| 航空| 通榆县| 龙口市| 古蔺县| 水城县| 永登县| 沁阳市| 岳普湖县| 滨州市|