1. 程式人生 > 實用技巧 >Java網路程式設計之終端聊天菜鳥版

Java網路程式設計之終端聊天菜鳥版

之前學習的一直都是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;
    }
    @Override
    
public 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。

溜了溜了,菜鳥式離場... ...