溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室

發(fā)布時(shí)間:2020-09-02 09:06:18 來源:腳本之家 閱讀:146 作者:xiaozhuaixifu 欄目:編程語言

本文實(shí)例為大家分享了java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室的具體代碼,供大家參考,具體內(nèi)容如下

主要實(shí)現(xiàn)的功能:

服務(wù)器端建立ServerSocket阻塞監(jiān)聽來自客戶端的Socket連接,并為之開辟一個(gè)新的線程

讀取來自該連接的數(shù)據(jù),廣播每一個(gè)客戶端數(shù)據(jù),這里簡單地使用一個(gè)鏈表保存所有來自客戶端的所有Socket連接

客戶端連接上服務(wù)器端后主要有兩個(gè)線程在工作:

主線程:不斷獲取鍵盤的輸入并寫入該Socket中傳輸給服務(wù)器

副線程:不斷從服務(wù)器Socket流中讀取傳來的數(shù)據(jù),打印到屏幕上。

服務(wù)器端代碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.ArrayList;
import javax.swing.JOptionPane;
 
public class MyServer {
 
 public static ArrayList<Socket> socketlist = new ArrayList<Socket>();
 private static String port ;
 public static void main(String[] args) throws IOException
 {
 //彈出一個(gè)對(duì)話框輸入端口號(hào)
 port = JOptionPane.showInputDialog("input the port number: ");
 int ServerPort = new Integer(port).intValue();
 
 ServerSocket ss = new ServerSocket(ServerPort);
 System.out.println("Server is initializating...");
 while(true)
 {
 System.out.println("Server is waiting...");
 
 //此處將阻塞監(jiān)聽
 Socket s = ss.accept();
 System.out.println("listening from: " + s.getInetAddress());
 socketlist.add(s);
 new Thread(new ServerThread(s)).start();
 }
 }
 
}
class ServerThread implements Runnable
{
 Socket s = null;
 BufferedReader br = null;
 public ServerThread(Socket s) throws IOException
 {
 this.s = s;
 br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 }
 public void run()
 {
 try
 {
 String content = null;
 while( (content = readFromClient()) != null )
 {
 //播報(bào)每個(gè)客戶端數(shù)據(jù)
 for(Socket s : MyServer.socketlist)
 {
 PrintStream ps = new PrintStream(s.getOutputStream());
 ps.println(content);
 }
 }
 }
 catch (IOException io) 
 {
 io.printStackTrace();
 }
 }
 private String readFromClient()
 {
 try
 {
 return br.readLine();
 }
 catch (IOException io)
 {
 MyServer.socketlist.remove(s);
 System.out.println(s.getInetAddress() + " is disconnecting...");
 }
 return null;
 }
 
}

客戶端代碼:

import java.net.Socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
 
public class MyClient {
 
 public static void main(String[] args) throws Exception
 {
 Socket s = new Socket("192.168.1.164", 30000);
 
 // new Thread to read content from server.
 new Thread(new ClientThread(s)).start();
 
 PrintStream ps = new PrintStream(s.getOutputStream());
 String line = null;
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 while((line = br.readLine()) != null)
 {
 ps.println(line);
 }
 }
}
class ClientThread implements Runnable
{
 private Socket s = null;
 BufferedReader br = null;
 public ClientThread(Socket s) throws IOException
 {
 this.s = s;
 br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 }
 public void run()
 {
 try
 {
 String content = null;
 while( (content = br.readLine()) != null)
 {
 System.out.println(content);
 }
 }
 catch (IOException io)
 {
 io.printStackTrace();
 }
 }
}

后期開發(fā):

上面程序功能很簡單,沒有記錄客戶信息,考慮添加功能如下:(多人聊天室)

客戶端發(fā)來的信息必須添加特殊標(biāo)識(shí),用于區(qū)別 登陸,私聊,公聊 三種,如果是登陸,則服務(wù)器端應(yīng)該有一個(gè)Map來保存用戶名和對(duì)應(yīng)輸出流中間的關(guān)系,用來處理用戶名重復(fù)的情況,還有如果是私聊,必須知道從客戶端發(fā)來消息的用戶名和將要發(fā)給哪一個(gè)用戶的特殊標(biāo)識(shí),考慮在輸入字符串里加入特殊標(biāo)識(shí)符。

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI