簡體   English   中英

多線程Java TCP客戶端

[英]Multi-threaded Java TCP Client

我正在編寫Java客戶端應用程序(帶有TCP / IP的基本Java Net程序包)。 客戶端必須從system.in接受輸入,同時必須通過套接字inputstream偵聽來自服務器的任何消息。 收到來自system.in的輸入后,客戶端將獲取該輸入,進行一些處理並將其作為請求發送到服務器。 所以基本上有2個進程在運行,

聽客戶的要求

-偵聽服務器響應。

為此,我實現了2個線程,並在主線程中運行了消息處理。 這個設計夠好嗎?

並且有一種方法可以將從system.in接收到的消息返回到主線程。 線程run()方法返回void。 我使用了一個volatile變量來返回接收到的字符串,但是它說volatile的代價非常高,因為它不使用cpu緩存來存儲該變量。

您可以查看我為Java套接字和多線程示例編寫的這兩個項目。

我猜想ClientExample是您要尋找的那個,但是您也可以看看服務器部分。

基本上,這個想法是啟動兩個單獨的線程來監聽不同的輸入-套接字和控制台。

final Thread outThread = new Thread() {
    @Override
    public void run() {
        System.out.println("Started...");
        PrintWriter out = null;
        Scanner sysIn = new Scanner(System.in);
        try {
            out = new PrintWriter(socket.getOutputStream());
            out.println(name);
            out.flush();

            while (sysIn.hasNext() && !isFinished.get()) {
                String line = sysIn.nextLine();
                if ("exit".equals(line)) {
                    synchronized (isFinished) {
                        isFinished.set(true);
                    }
                }
                out.println(line);
                out.flush();
                disconnect();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    };
};
outThread.start();

另一個用於套接字輸入的線程:

        final Thread inThread = new Thread() {
            @Override
            public void run() {
                // Use a Scanner to read from the remote server

                Scanner in = null;
                try {
                    in = new Scanner(socket.getInputStream());
                    String line = in.nextLine();
                    while (!isFinished.get()) {
                        System.out.println(line);
                        line = in.nextLine();
                    }
                } catch (Exception e) {
//                  e.printStackTrace();
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            };
        };
        inThread.start();

我希望這能幫到您 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM