Socket是網絡編程中最基本的通信接口,常用的網絡輔助類,比如URL等之類,其底層還是基於Socket來實現的。
而Socket,形象來說,就是連接通信的兩端,比如這樣 S<==>S,中間的通道就是網絡了,而簡單地利用Socket,我們就可以來實現一個簡單的聊天功能
具體效果看下圖:
這只是在本地中試用的效果,如果加上UI界面,其實就可以做成一個聊天的小應用了。
1. Server 端主要是利用ServerSocket的accept方法來等待客戶端的連接,如果客戶一直沒有連接,則會在這裏等待,直到客戶端請求到來。
而客戶端就是一個Socket,當客戶端請求到來的時候,accept會返回一個Socket對象, 這就是S<==>S中的左邊那個S了,可以利用其InputStream和OutputStream來進行讀寫了,讀就是接收信息,而寫就是回覆信息。
- public class Server {
- public static void main(String[] args) {
- try {
- ServerSocket server = new ServerSocket(9999);
- Helper.println("Server started, waiting for message.");
- Socket client = server.accept();
- PrintWriter pw = null;
- while (true) {
- BufferedReader br = new BufferedReader(new InputStreamReader(
- client.getInputStream()));
- String content = br.readLine();
- if (content.equals("end")) {
- server.close();
- br.close();
- if (pw != null) {
- pw.close();
- }
- break;
- }
- Helper.println(content);
- Helper.print("Server:");
- pw = new PrintWriter(client.getOutputStream(), true);
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- String output = "Server : " + in.readLine();
- pw.println(output);
- pw.flush();
- }
- Helper.println("Client left! Server Closed.");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
2. Client端就是一個Socket,並定義一個連接的地址和端口,地址表明是網絡中哪一臺主機,而端口則表明了是主機中的那個應用程序,很顯然就是上面Server這個應用,因爲其定義了其等待監聽的端口就是9999。當創建了一個Socket對象,並指定了地址和端口的時候,其實就已經發送了一個請求去對應的Server,請求連接,而如果連接成功,就可以繼續下去,不然直接拋出異常。當然,這裏連接成功,必須是Server先在監聽了。
- public class Client {
- public static void main(String[] args) {
- try {
- Socket client = new Socket("127.0.0.1", 9999);
- PrintWriter pw = null;
- InputStreamReader isr = null;
- Helper.println("Client started, ready to write content.");
- String input = "";
- while (true) {
- Helper.print("Client : ");
- InputStream is = System.in;
- input = new BufferedReader(new InputStreamReader(is))
- .readLine();
- pw = new PrintWriter(client.getOutputStream(), true);
- pw.println("Client:" + input);
- if (input.equals("end")) {
- client.close();
- is.close();
- pw.close();
- if (isr != null) {
- isr.close();
- }
- break;
- }
- isr = new InputStreamReader(client.getInputStream());
- Helper.println(new BufferedReader(isr).readLine());
- }
- Helper.println("Client stopped!");
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
嗯,結束。