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

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

 更新時間:2019年01月09日 15:41:16   作者:xiaozhuaixifu  
這篇文章主要為大家詳細(xì)介紹了java基于C/S結(jié)構(gòu)實現(xiàn)多線程聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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

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

主線程:不斷獲取鍵盤的輸入并寫入該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
 {
 //彈出一個對話框輸入端口號
 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 )
 {
 //播報每個客戶端數(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)識,用于區(qū)別 登陸,私聊,公聊 三種,如果是登陸,則服務(wù)器端應(yīng)該有一個Map來保存用戶名和對應(yīng)輸出流中間的關(guān)系,用來處理用戶名重復(fù)的情況,還有如果是私聊,必須知道從客戶端發(fā)來消息的用戶名和將要發(fā)給哪一個用戶的特殊標(biāo)識,考慮在輸入字符串里加入特殊標(biāo)識符。

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

相關(guān)文章

最新評論