簡體   English   中英

我不明白為什么我的一個客戶端程序不能向服務器發送多於一條消息?

[英]I don't understand why one of my client program can't send more than one message to the server?

我創建了一個簡單的服務器 class 和一個簡單的客戶端 class。 我有兩個連接到服務器的客戶端程序。 客戶端和服務器 class 可以發送和接收消息。

問題是當兩個客戶端都連接到服務器時,其中一個客戶端可以向服務器發送多條消息,而另一個客戶端只能向服務器發送一條消息。

這是我的服務器 class 的構造函數:

   public MyServer () {
      setUpConnection ();
   }

以下是將客戶端連接到端口的代碼:

   public void setUpConnection () {
     clientOutputStreams = new ArrayList ();
     try {
       serverSocket = new ServerSocket (5000);
     while (true) {
       Socket clientSocket = serverSocket.accept ();
       printWriter = new PrintWriter (clientSocket.getOutputStream ());
       clientOutputStreams.add (printWriter);

       Thread thread = new Thread (new clientHandler (clientSocket));
       thread.start();

       System.out.println ("Client is connected to server");
     }    
    } catch (Exception e) {
       e.printStackTrace ();
    }
  }

這是將服務器收到的消息發送給其他客戶端的代碼:

    public void tell everyone (String message) {
     Iterator outputObject = clientOutputStreams.iterator();

     while (outputObject.hasNext()) {
        try {
            PrintWriter writer = (PrintWriter) outputObject.next();
            writer.println (message);
            writer.flush ();
        } catch (Exception e) {
            e.printStackTrace ();
        }
     }
 }

這是在單獨線程中運行的代碼,用於偵聽客戶端發送的消息:

    public class clientHandler implements Runnable {

       Socket clientSocket;

       public clientHandler (Socket socket) {
          try {
           clientSocket = socket;
           isr = new InputStreamReader (clientSocket.getInputStream());
           reader = new BufferedReader (isr); 
          } catch (Exception e) {
          e.printStackTrace ();
       }
    }

    public void run () {
        String message;

      try {
        while ((message = reader.readLine()) != null) {
            System.out.println ("I recieved message: " + message);
            tellEveryone (message);
        }  
      } catch (Exception e) {
          e.printStackTrace();
      }
     }
    }
 }

這是我的客戶 class 的構造函數:

   public MyClient() {
      initComponents();
      setUpConnection ();
      Thread thread = new Thread (new recievingMessages ());
      thread.start ();
      jtaRec.setEditable (false);
      jtfSend.addFocusListener (this);
      jtfSend.requestFocus();
   }                

這是客戶端按下發送按鈕時運行的代碼:

private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    try {
        writer.println (jtfSend.getText ());
        System.out.println (jtfSend.getText ());
        writer.flush ();
        System.out.println ("message has sent");
    } catch (Exception e) {
        e.printStackTrace ();
    }//CLOSE CATCH STATEMENT
    jtfSend.setText ("");
    jtfSend.requestFocus();
}                                          

以下是將客戶端連接到服務器的代碼:

public void setUpConnection () {
  try {
    socket = new Socket ("127.0.0.1", 5000);
    writer = new PrintWriter (socket.getOutputStream ());
    stream = new InputStreamReader (socket.getInputStream ());
    reader = new BufferedReader (stream);

    System.out.println ("Connection Made");
  } catch (Exception e) {
      e.printStackTrace ();
  }
}

這是代碼在單獨的線程中運行並偵聽服務器發送的消息:

  public class recievingMessages implements Runnable {
      public void run () {
        String message;
        try {
         while ((message = reader.readLine ()) != null) {
            jtaRec.append (message + "\n");
            System.out.println ("I recieved the message" + " " + message);
         }
        } catch (Exception e) {
           e.printStackTrace();
       }
    }
  }

我已經嘗試找到解決方案,但我只是不明白為什么一個客戶端只能發送一條消息而另一個客戶端可以發送多條消息,即使兩個程序共享相同的 class。

我玩了一下你的網絡代碼,它似乎工作正常。

我的意思是,兩個客戶端都能夠發送和接收多條消息:

#### server logs ####           ### Jack logs ###           ### Gill logs ###
Starting server
Client is connected to server   Jack connected
SRV:1 received: Jack: Aa #1     SND:Jack - Jack: Aa #1
                                RCV:Jack - Jack: Aa #1
Client is connected to server   SND:Jack - Jack: Aa #2      Gill connected
SRV:1 received: Jack: Aa #2     RCV:Jack - Jack: Aa #2      RCV:Gill - Jack: Aa #2
SRV:2 received: Gill: Zz #1     RCV:Jack - Gill: Zz #1      RCV:Gill - Gill: Zz #1
                                                            SND:Gill - Gill: Zz #1
SRV:2 received: Gill: Zz #2     RCV:Jack - Gill: Zz #2      RCV:Gill - Gill: Zz #2
                                                            SND:Gill - Gill: Zz #2
SRV:1 received: Jack: Aa #3     RCV:Jack - Jack: Aa #3      RCV:Gill - Jack: Aa #3
                                SND:Jack - Jack: Aa #3
SRV:2 received: Gill: Zz #3     RCV:Jack - Gill: Zz #3      RCV:Gill - Gill: Zz #3
                                                            SND:Gill - Gill: Zz #3
SRV:2 received: Gill: Zz #4     RCV:Jack - Gill: Zz #4      RCV:Gill - Gill: Zz #4
                                                            SND:Gill - Gill: Zz #4
SRV:1 received: Jack: Aa #4     SND:Jack - Jack: Aa #4
                                RCV:Jack - Jack: Aa #4      RCV:Gill - Jack: Aa #4
SRV:2 received: Gill: Zz #5     RCV:Jack - Gill: Zz #       RCV:Gill - Gill: Zz #5
                                                            SND:Gill - Gill: Zz #5
SRV:1 received: Jack: Aa #5     SND:Jack - Jack: Aa #5
                                RCV:Jack - Jack: Aa #5

最有可能的是,在您的情況下,其中一個客戶端連接得太晚並且無法獲取整個歷史記錄,因為此功能未在服務器端實現。

此外,您的一個客戶可能過早斷開連接並丟失了部分歷史記錄。

為了進一步分析丟失消息的原因,您可能需要提供您的 UI 代碼的詳細信息(您如何在initComponents()中構建 UI 並運行客戶端應用程序)。

如果您在 GUI 線程之外更改 UI 組件可能無法更新,因此調用jtaRec.revalidate()可能會有所幫助。

暫無
暫無

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

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