java 類似QQ的本地聊天室程式實現(上)(客戶端程式)
阿新 • • 發佈:2019-01-25
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){ } } } }