您好,登錄后才能下訂單哦!
上節回顧:在學習了Socket建立客戶端和服務器雙向交流后,我們發現它的問答形式不夠靈活。
本節課我們講解如何在服務器和客戶端之間實現聊天室~
需要思考的問題:
服務器端:一個線程專門發送消息,一個線程專門接收消息。
客戶端:一個線程專門發送消息,一個線程專門接收消息。
除了消化這段代碼外,還需要思考,怎么實現一個聊天室!(難度較大!!)
【示例1】聊天室服務器端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket;
public class ChatServer {
public static void main(String[] args) { ServerSocket server=null; Socket socket=null; BufferedReader in=null; try { server = new ServerSocket(8888); socket=server.accept(); new ServerThread(socket).start();
//main線程負責讀取客戶端發來的信息 in=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String str=in.readLine(); System.out.println("客戶端說:"+str); } } catch (IOException e) { e.printStackTrace(); }finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); }
}
} }
/** * 專門向客戶端發送消息的線程 * @author Administrator * */ class ServerThread extends Thread { Socket ss; BufferedWriter out; BufferedReader br; public ServerThread(Socket ss){ this.ss = ss; try { out=new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); br = new BufferedReader(new InputStreamReader(System.in)); } catch (IOException e) { e.printStackTrace(); } } public void run(){ try { while(true){ String str2 = br.readLine(); out.write(str2+"\n"); out.flush(); } } catch (IOException e) { e.printStackTrace(); }finally{ try { out.close(); } catch (IOException e) { e.printStackTrace(); } try { br.close(); } catch (IOException e) { e.printStackTrace(); } }
} }
|
【示例2】聊天室客戶端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;
public class ChatClient { public static void main(String[] args) { Socket socket = null; BufferedReader in = null; try { socket=new Socket(InetAddress.getByName("192.168.1.32"),8888); new ClientThread(socket).start(); in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//main線程負責接收服務器發來的信息 while(true){ System.out.println("服務器說:"+in.readLine()); }
} catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); }
try { in.close(); } catch (IOException e) { e.printStackTrace(); } }
} }
/** * 用于向服務器發送消息 * @author Administrator * */ class ClientThread extends Thread{ Socket s; BufferedWriter out; BufferedReader wt; public ClientThread(Socket s){ this.s = s; try { out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); wt=new BufferedReader(new InputStreamReader(System.in)); } catch (IOException e) { e.printStackTrace(); }
} public void run(){ try { while(true){ String str = wt.readLine(); out.write(str+"\n" ); out.flush(); } } catch (IOException e) { e.printStackTrace(); }finally{ try { wt.close(); } catch (IOException e) { e.printStackTrace(); } try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數據庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰
E-Java高級框架精解
F-Linux和Hadoop
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。