java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線(xiàn)程聊天室
本文實(shí)例為大家分享了java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線(xiàn)程聊天室的具體代碼,供大家參考,具體內(nèi)容如下
主要實(shí)現(xiàn)的功能:
服務(wù)器端建立ServerSocket阻塞監(jiān)聽(tīng)來(lái)自客戶(hù)端的Socket連接,并為之開(kāi)辟一個(gè)新的線(xiàn)程
讀取來(lái)自該連接的數(shù)據(jù),廣播每一個(gè)客戶(hù)端數(shù)據(jù),這里簡(jiǎn)單地使用一個(gè)鏈表保存所有來(lái)自客戶(hù)端的所有Socket連接
客戶(hù)端連接上服務(wù)器端后主要有兩個(gè)線(xiàn)程在工作:
主線(xiàn)程:不斷獲取鍵盤(pán)的輸入并寫(xiě)入該Socket中傳輸給服務(wù)器
副線(xiàn)程:不斷從服務(wù)器Socket流中讀取傳來(lái)的數(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ì)話(huà)框輸入端口號(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)聽(tīng)
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è)客戶(hù)端數(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;
}
}
客戶(hù)端代碼:
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();
}
}
}
后期開(kāi)發(fā):
上面程序功能很簡(jiǎn)單,沒(méi)有記錄客戶(hù)信息,考慮添加功能如下:(多人聊天室)
客戶(hù)端發(fā)來(lái)的信息必須添加特殊標(biāo)識(shí),用于區(qū)別 登陸,私聊,公聊 三種,如果是登陸,則服務(wù)器端應(yīng)該有一個(gè)Map來(lái)保存用戶(hù)名和對(duì)應(yīng)輸出流中間的關(guān)系,用來(lái)處理用戶(hù)名重復(fù)的情況,還有如果是私聊,必須知道從客戶(hù)端發(fā)來(lái)消息的用戶(hù)名和將要發(fā)給哪一個(gè)用戶(hù)的特殊標(biāo)識(shí),考慮在輸入字符串里加入特殊標(biāo)識(shí)符。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決
這篇文章主要介紹了關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
淺談JAVA字符串匹配算法indexOf函數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了淺談字符串匹配算法indexOf函數(shù)的實(shí)現(xiàn)方法,indexOf函數(shù)我們可以查找一個(gè)字符串(模式串)是否在另一個(gè)字符串(主串)出現(xiàn)過(guò)。對(duì)此感興趣的可以來(lái)了解一下2020-07-07
Spring中DAO被循環(huán)調(diào)用的時(shí)候數(shù)據(jù)不實(shí)時(shí)更新的解決方法
這篇文章主要介紹了Spring中DAO被循環(huán)調(diào)用的時(shí)候數(shù)據(jù)不實(shí)時(shí)更新的解決方法,需要的朋友可以參考下2014-08-08
JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例)
這篇文章主要介紹了JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01

