JAVA通訊(三)——實現多人聊天

Alexwym發表於2018-07-23

《JAVA通訊(一)——輸入資料到客戶端》

《JAVA通訊(二)——實現客戶端和伺服器的通訊》

前面我們是已經實現了客戶端和伺服器的通訊,但是還存在著一個問題,那就是伺服器一次只能跟一個客戶端通訊。通俗講就是你使用QQ時一次只能和一個人聊天。今天我們繼續完善一下這個通訊程式,實現多人聊天。

一、多執行緒

如果我們要實現多人聊天,那麼我們就必須為每一個客戶機建立一個執行緒。這個執行緒用來處理伺服器和當前客戶機的通訊。過程圖如下:

 

二、具體程式碼

在前面兩篇部落格的程式碼基礎我們對其進行改進,使其成為一個多執行緒的程式。

package communicatetest3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//定義一個通訊類
public class ServerThread extends Thread {
	OutputStream output;//輸出流
	InputStream input;//輸入流
	Socket socket;//定義一個socket接收物件的屬性
	
	//執行緒建立方法
	public void run() {
		try {		
			System.out.println("已啟動一個執行緒來處理~");
			
			//為輸入輸出流賦值
			output=socket.getOutputStream();
			input=socket.getInputStream();
			//開始通訊
			//傳送資訊給客戶機
			String outS="Hello,welcome to my ServerSocket!\r\n";
			out(outS);
			
			//傳送資訊給伺服器
			ReadString();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//定義一個建立伺服器的方法
	private void setUpServer(int port) throws IOException {
		//將輸入的埠設定為伺服器
		ServerSocket server=new ServerSocket(port);
		//輸出當前伺服器的埠號
		System.out.println("伺服器建立成功,埠號:"+server.getLocalPort());
		while(true) {
			ServerThread ts=new ServerThread();
			//為物件的socket屬性賦值。
			ts.socket=server.accept();
			//啟動執行緒
			ts.start();
		}
	}	
	
	//定義一個輸出資訊到客戶機的方法
	private void out(String outS) throws IOException {
		//將字串轉化為byte陣列
		byte[] dataout=outS.getBytes();
		//呼叫write()將資訊傳送客戶機
		output.write(dataout);
		//強制輸出到命令列的介面中
		output.flush();
	}

	//定義一個傳送字串給伺服器的方法
	public void ReadString() throws IOException {
		String inputS="";
		while(!inputS.equals("bye")) {
			//讀取第一個字元
			int AsciiNumber=input.read();
			while(AsciiNumber!=13) {
				//將ascii碼轉化為相應的char型字元
				inputS+=(char)AsciiNumber;
				//接收下一個字元
				AsciiNumber=input.read();
			}
			System.out.println(inputS);
		}
		//關閉連線
		output.close();
	}
	
	//主函式入口
	public static void main(String[] args) throws IOException {
		//建立一個通訊類的物件
		ServerThread server=new ServerThread();
		server.setUpServer(9014);
	}

}

三、命令列執行結果

從執行結果我們會發現程式已經可以進行多人聊天了~

 

相關文章