Java網路程式設計之終端聊天菜鳥版
阿新 • • 發佈:2020-08-08
之前學習的一直都是javaweb,什麼前端框架、SSM、nginx、資料庫之類的,對於網路程式設計方面,我的瞭解可以說幾乎為0。最近在工作中需要使用netty來實現一些內網通訊的功能,這就比較尷尬了,瞬間感覺到這個世間充滿了惡意,這不是專挑我的軟肋下死手麼?
上網找了一些netty的講解和示例,理論部分半懂不懂,實際上手也是參照著示例寫程式碼,這還真是“網路程式設計”呢,我笑了。
為了能學好這一塊知識盲區,我決定從socket開始摸索,簡單看了幾篇文件,發現基礎操作的話,似乎也不難,就想著先搞個極簡版終端聊天練練手吧,為什麼要搞終端聊天呢?(當然是因為不想學java的介面開發的知識),結果光速打臉了,這不應該呀?我這設想很美好,一個客戶端、一個服務端,一邊搞兩個執行緒,一個執行緒負責傳送資料,一個執行緒負責接收資料,至於接收資料的這個執行緒,怎麼監聽資料我不會搞,那就來個樸實無華又簡單基礎的迴圈加判斷吧。然而,就是不能正常通訊?
最終在查閱了幾篇文件之後,找到了問題所在,由於我的io流方面的知識知之甚少,所以就很尷尬了,貌似是資料沒過去... ...
程式碼如下(簡單易懂且很菜,算是我自己備忘一下):
public class SendHandler implements Runnable { PrintWriter writer = null; public SendHandler(PrintWriter writer) { this.writer = writer; } @Override public void run() { Scanner scanner= new Scanner(System.in); while (true) { writer.println(scanner.nextLine()); } } }
以上是傳送資料的處理器
public class ReciveHandler implements Runnable { BufferedReader reader = null; public ReciveHandler(BufferedReader reader) { this.reader = reader; } @Overridepublic void run() { while (true) { try { System.out.println("RE:" + reader.readLine()); } catch (IOException e) { e.printStackTrace(); } } } }
以上是接收資料的處理器
public class Client { public static ExecutorService pool = Executors.newFixedThreadPool(2); public static void main(String[] args) throws IOException { Socket socket = new Socket("0.0.0.0", 8089); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); send(writer); recive(reader); } public static void send(PrintWriter writer) { pool.execute(new SendHandler(writer)); } public static void recive(BufferedReader reader) { pool.execute(new ReciveHandler(reader)); } }
以上是客戶端
public class Server { public static ExecutorService pool = Executors.newFixedThreadPool(2); public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8089); Socket socket = serverSocket.accept(); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); send(writer); recive(reader); } public static void send(PrintWriter writer) { pool.execute(new SendHandler(writer)); } public static void recive(BufferedReader reader) { pool.execute(new ReciveHandler(reader)); } }
以上是服務端
然後,就沒有然後了...
如果有和我同樣剛剛接觸到這方面的小夥伴們覺得看不大懂(這機率應該比較小吧),那可以瞭解一下,執行緒池、io流、socket。
溜了溜了,菜鳥式離場... ...