在繼續記錄NIO的學習之前,我覺得有必要先復習一下IO相關的知識。今天就說一下網絡套接字Socket
廢話不多說,先上代碼,這里實現一個最簡單的Echo功能,客戶端發送一條消息服務端直接進行返回。
服務端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * @Description: * @author:xyq * @date:2018年6月6日 */ public class Server { ServerSocket ss = null; public static void main(String[] args) { new Server().startServer(); } public void startServer() { Socket socket = null; try { ss = new ServerSocket(1234); // 監聽1234端口 while (true) { socket = ss.accept(); // 堵塞式接受Socket new ServerThread(socket).start(); // 放入線程進行處理 } } catch (IOException e) { e.printStackTrace(); } } class ServerThread extends Thread { Socket socket = null; public ServerThread(Socket socket){ this.socket = socket; } /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { BufferedReader br = null; PrintWriter pw = null; try { pw = new PrintWriter(socket.getOutputStream()); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true) { String line = br.readLine(); System.out.println("從客戶端來的信息:" + line); pw.println("你好,服務器已經收到您的信息!'" + line + "'\n"); pw.flush(); System.out.println("已經返回給客戶端!"); } } catch (IOException e) { e.printStackTrace(); } finally { try { pw.close(); br.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
客戶端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * @Description: * @author:xyq * @date:2018年6月6日 */ public class Client { public static void main(String[] args) { new Client().startClient(); } public void startClient() { Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { socket = new Socket("localhost", 1234); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream()); String get = "客戶端" + Math.random() * 1000; while (true) { if (get != null && get.length() > 0) { pw.println(get); // 寫入緩沖流 pw.flush(); // 刷新緩沖 } if (br != null) { String line = br.readLine(); System.out.println("從服務器來的信息:" + line); } Thread.sleep(2000); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }