天天看點

基本網絡聊天室

     首先,實作一個最簡單的網絡聊天室,必備兩個裝置——伺服器和多個用戶端。伺服器可以是我們自己的電腦, 而用戶端我們可以用cmd來模拟。

  于是我們分四步來實作:

一: 建立伺服器

   java.net.ServerSocket server = new java.net.ServerSocket(10101);//10101未連接配接端口号

(參考類的介紹————)

二:接收連接配接到了伺服器的用戶端

Socket socket = server.accept();//發現一個用戶端

 三: 接下來的操作就是對輸出和輸入流的操作了————因為一個用戶端就可以看做是一個流的對象,我們可以接收用戶端裡的輸入,也可以從伺服器想用戶端輸出消息。

詳細内容見代碼:——

package 聊天室01;

import java.net.Socket;
import java.util.Map;

public class Severs {

	//使用一個靜态的map來儲存用戶端号和用戶端
	public static Map<Integer, Socket> map =  new java.util.HashMap<Integer, Socket>();
	public static void main(String[] args) {
		try {
			//建立伺服器對象
			java.net.ServerSocket server = new java.net.ServerSocket(10101);
			System.out.println("伺服器已開啟");
			int num = 1;//定義變量來記錄用戶端的個數
			while(true){//死循環的接受用戶端連接配接
				Socket socket = server.accept();//發現一個用戶端
				map.put(num, socket);//儲存
				Client_thread  client = new Client_thread(socket , num);//立即開一個線程來處理
				client.start();//開始線程
				num++;//下一個用戶端的編号加一
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

}
           

為了接收多個用戶端同時,我果斷開啟了多線程來實作用戶端的

package 聊天室01;

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

public class Client_thread extends Thread{

	private Socket socket;//一個用戶端
	private int num;//記錄目前的用戶端編号
	Client_thread(Socket socket , int num){
		this.socket = socket;
		this.num = num;
	}
	
	 public void run() {
		 try {//向伺服器直接輸出消息
			System.out.println("客戶端   "+num+" : "+socket.getLocalSocketAddress().toString()+"已連接配接");
			OutputStream output = socket.getOutputStream();//獲得向目前用戶端輸出的流
			output.write(("歡迎  歡迎 \r\n").getBytes());//先把字元串轉換為字元數組 然後以位元組流輸出到用戶端
			output.flush();//強制輸出結束
//			output.close();
			//獲得目前用戶端的輸入流
			InputStream input = socket.getInputStream();
			while(true){//不斷地接收用戶端的輸入
				char ch = (char)input.read();//按位元組接受輸入
				String str = "" + ch;
				while(ch!='\n'){
					ch = (char)input.read();
					str+=ch;
				}
				System.out.print("用戶端  "+num+" 說: "+str);//輸入到伺服器
				for(int i=0 ; i<Severs.map.size() ; i++){//想其他的線上伺服器發送消息
					if(num != (i+1)){//除了自己
						OutputStream output_temp = Severs.map.get(i+1).getOutputStream();//獲得用戶端輸出的流
						output_temp.write(str.getBytes());//先把字元串轉換為字元數組 然後以位元組流輸出到用戶端
						output_temp.flush();
					}
				}				
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	 }
}
           

四:運作代碼 ,開啟伺服器。

        打開cmd ,連接配接伺服器 telnet 127.0.0.1 10101 中間的是本機IP 最後一個是我們本機伺服器的端口

      (注意:需要先打開telnet系統服務,預設是不打開的(控制台—程式與功能—打開或關閉windows 

        功能然後選中telnet用戶端))

繼續閱讀