簡體   English   中英

Java線程:如何在代碼中找到正確的位置,為允許多個客戶端連接到服務器的程序創建新線程

[英]Java Threads: How to find the right place in code to create a new thread for a program that allows multiple clients to connect to the server

我正在創建兩個程序文件(一個客戶端一個服務器)。 客戶端代碼必須能夠創建多個客戶端才能連接到服務器(只有一個服務器,可以有多個和/或無限數量的客戶端)。 必須為連接到服務器的每個客戶端創建一個新線程。 創建客戶端的方法是打開一個新的命令提示符/ mac終端窗口並運行客戶端文件。 連接客戶端后,它可以向服務器發送消息。 它還將從服務器接收從其他連接的客戶端發送的所有消息。

我們現在將重點關注客戶端代碼。 (還沒有服務器代碼)

在下面的代碼中有兩個地方我創建了新的線程,我不確定它應該位於哪個位置因為在eclipse中運行程序時沒有錯誤。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class ChatClient
{
    private static Socket Socket;
    static int numberOfClients = 0;
    public static void main(String args[]) 
    {


          //If I wanted to create multiple clients, would this code go here? OR should the new thread creation be outside the while(true) loop?
          while (true)
          {
              try 
              {
                  String host = "localhost";
                  InetAddress address = InetAddress.getByName(host);
                  numberOfClients += 1;
                  Thread ChatClient1 = new Thread ()
                  {
                      public void run()
                      {   
                          ServerSocket serverSocket = null;
                          Socket socket = null;
                          try 
                          {
                              int numberofmessages = 0;
                              String[] messagessentbyotherclients = null;
                              System.out.println("Try block begins..");
                              System.out.println("Chat client is running");
                              String port_number1= args[0];
                              System.out.println("Port number is: " + port_number1);
                              int port = Integer.valueOf(port_number1);
                              System.out.println("Listening for connections..");
                              System.out.println( "Listening on port: " + port_number1 );
                              serverSocket = new ServerSocket(port);
                              for(int i = 0; i < numberOfClients; i++)
                              {
                                  System.out.println(messagessentbyotherclients);
                              }
                          }
                          catch (IOException e)
                          {
                              e.printStackTrace();
                          }
                      }
                  };
                  ChatClient1.start();
        }
        catch (IOException e)
        {
            System.out.println("I/O error: " + e);
        }
    }
}

我的問題是:是應該在主函數下面還是在while(true)循環內創建線程? (while循環最終將由標准輸入中的控件D退出)

您的代碼遠不是一個有效的解決方案,我不認為評論它對您有幫助。 正如評論中的人已經解釋過,您應該為客戶端和服務器提供2個可執行文件。 您現在所做的是在內部循環中生成服務器線程,而不會創建連接到同一服務器的多個客戶端。

使用每個客戶端一個線程編寫多線程客戶端/服務器應用程序的常用方法是編寫一個服務器可執行文件,它打開一個ServerSocket ,它accept並生成一個新的Thread來處理循環中的客戶端套接字。

然后編寫一個客戶端可執行文件,它使用Socket connect到服務器(在用於生成服務器的端口上),並與服務器通信。

可以使用從連接兩端的套接字獲得的輸入/輸出流來完成通信。

這看起來很像家庭作業,所以我不會提供工作代碼,但您可以嘗試按照以下步驟操作:

  • 使用main方法創建兩個類
  • 在一個類中創建一個Socket ,它調用connect到服務器。 嘗試從客戶端發送最簡單的消息,例如包含“hello world”的行。 PrintWriter可以用於將套接字的OutputStream包裝在更方便的界面中。
  • 在另一個類中創建一個ServerSocket並在循環中調用accept ,將返回的Socket交給新的Thread ,它循環來自客戶端的輸入,直到從客戶端收到終止信號或連接關閉(IOException)。 您可以通過將InputStream包裝在BufferedReader並打印客戶端發送的內容逐行讀取。
  • 通過發送/接收響應確保通信雙向工作(服務器將響應寫入與客戶端關聯的套接字的OutputStream ,客戶端讀取其套接字的InputStream
  • 通過連接實現應用程序的協議

完成后,首先啟動服務器,然后根據需要運行多個客戶端。 需要首先啟動服務器,因為如果服務器正在偵聽客戶端連接的端口,則connect調用將在內部打開一個連接,該連接只能完成。 如果線程很復雜,請嘗試編寫一個只接受連接的服務器,然后從中讀取一行,並在添加線程邏輯之前將其關閉。 在您的代碼中,我覺得您似乎並不完全了解客戶端/服務器連接的工作原理。 現在你甚至不能擁有一個客戶,因為 - 除了所有其他問題 - 你既不accept也不connect

暫無
暫無

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

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