1. 程式人生 > >java 類似QQ的本地聊天室程式實現(上)(客戶端程式)

java 類似QQ的本地聊天室程式實現(上)(客戶端程式)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 *  聊天室客戶端
 * @author soft01
 *
 */
public class Client {
	/*java.net.Soecket
	 * 套接字 封裝了TCP協議的通訊
	 * 使用Socket可以連結伺服器,連結後可以建立
	 * 一個輸入流和一個輸出流,使用輸出流將資料傳送至伺服器,通過輸入流用於讀取伺服器段傳送過來的資料
	 * 從而實現與服務端的通訊
	 * 
	 */
	private Socket socket;
	/*
	 * 構造方法 用來初始化客戶端
	 */
	public  Client() throws Exception{
		/*
		 *  初始化Socket就是連結遠端計算機的過程
		 *  引數1:遠端計算機地址
		 *  引數2:遠端計算機埠
		 * 通過地址可以找到網路上的伺服器端計算機
		 * 通過埠可以找到計算機上執行的服務端應用程式 從而建立連結
		 *  若連結成功 構造方法返回Socket例項 若失敗會丟擲異常
		 */
		socket=new Socket("172.20.9.234",8088);
		
	}
	/*
	 * 啟動方法 用來執行客戶端業務邏輯
	 */
	public void start() throws IOException{
		//System.out.println("你好請輸入:");
		Scanner scan=new Scanner(System.in);
		
		//啟動與讀取服務端傳送的訊息的執行緒
		ServerHander handler=new ServerHander();
		Thread t=new Thread(handler);
		t.start();
		/*
		 * outputstream getoutputstream()
		 * scoket提供的該方法是用來獲取一個輸出流,
		 * 通過該輸出流寫出的資料會被髮送至遠端計算機(對客戶端而言遠端計算機就是服務端)
		 */
		OutputStream out=socket.getOutputStream();
		OutputStreamWriter osw=new OutputStreamWriter(out,"UTF-8");
		/*使得輸出資料按行輸出
		 *引數true 表明是:自動重新整理答應
		 */
		while(true){
			String str=scan.nextLine(); 
			PrintWriter pw=new PrintWriter(osw,true);
			/*光寫PW.Print是不行的,因為寫的東西根本就填補滿緩衝區,這樣就導致發不出去
			 * 所以我們.flush來重新整理一下,我們可以用自動行重新整理:println
			 */
			pw.println(str);
		}
		}
		
	public static void main(String[] args) {
		try{
			Client client=new Client();
			client.start();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	/*
	 *  該執行緒負責一直讀取服務端傳送過來的訊息
	 *  並輸出到控制檯顯示給使用者
	 */
	private class ServerHander implements Runnable{

		@Override
		public void run() {
			try{
				InputStream in=socket.getInputStream();
				InputStreamReader isr=new InputStreamReader(in);
				BufferedReader br=new BufferedReader(isr);
				String message=null;
				while((message=br.readLine())!=null){
					System.out.println(message);
				}
			}catch(Exception e){
				
			}
		}
		
	}
	
}