【问题标题】:Can I send data via TCP before closing Socket?我可以在关闭 Socket 之前通过 TCP 发送数据吗?
【发布时间】:2018-06-12 14:59:12
【问题描述】:

我会更好地解释我的问题,并且我会为我的英语不好说抱歉。我正在练习 java.net 包(这是我下一次大学考试的论点),我试图更好地控制客户端和服务器设备之间的通信。更准确地说,我尝试使用 TCP 连接在 3 个不同的时间从服务器到客户端发送 3 个不同的字符串,然后调用 close() 方法到相关的 Socket。我发现我的脚本没有按预期工作。在客户端,我收到所有 3 个字符串,但只有在我关闭 Socket 时才会收到。相反,我希望在将它们放入服务器的输出流后立即接收所有 3 条消息。我将发布服务器脚本的代码。

在批评我之前,我在写一个新问题之前阅读了this问题,但它并没有解决我的问题 下面的脚本是管理我在服务器端的连接的线程的 run() 方法的主体。

try{
        //Dormi per un pò..

        System.out.println("Il Client con ip "+ind+" ed associato all' Handler #"+id+" è in attesa");
        Thread.sleep(5000);
        PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
        pw.println("Hi "+ind); //ind is the InetAddress of the connected client
        pw.flush();
        Thread.sleep(5000);
        pw.write("what's up?\n");
        pw.flush();
        Thread.sleep(5000);
        pw.write("I gotta go. Bye\n");
        pw.flush();
        pw.close();
        s.close();
        System.out.println("Il Client associato all'Handler #"+id+" si è disconnesso");
    }catch(Exception e){
        e.printStackTrace();
    }

这是客户端代码:

package socket;


import java.net.*;
import java.io.*;
public class MultiThreadClient extends Thread{

   private byte[] address={(byte) 192, (byte)168, (byte) 1, (byte)15};
   private int destPort=2000;

   public MultiThreadClient(){
       super();
   }

   public void run(){
       try{
           InetAddress ip=InetAddress.getByAddress(address);
           Socket s=new Socket(ip,destPort);
           s.setReuseAddress(true);
           BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); 
           String message1=br.readLine();
           String message2=br.readLine();
           String message3=br.readLine();
           System.out.println(message1);
           System.out.println(message2);
           System.out.println(message3);

           s.close();
       }catch(Exception e){
           e.printStackTrace();
       }
  }


  public static void main(String[]args){
  //for(int i=0;i<3;i++){
      MultiThreadClient mtc=new MultiThreadClient();
      mtc.start();
  // }
  }

}

【问题讨论】:

  • 请添加客户端的阅读部分。
  • 好的。我刚刚编辑了它。
  • 再次编辑,因为我更改了客户端部分以接收所有 3 个字符串。

标签: java sockets tcp communication


【解决方案1】:

您的代码运行良好 - 您只是在 readLine 方法上阻塞了 3 次,然后打印您的响应(此时套接字在服务器端关闭)。

试试这个:

        String message1 = br.readLine();
        System.out.println(message1);
        String message2 = br.readLine();
        System.out.println(message2);
        String message3 = br.readLine();
        System.out.println(message3);

我的另一个提示是在 finally 块中进行清理。

try { ... }
catch { ... }
finally {
    s.close();
}

这样即使抛出异常也会清理资源。

【讨论】:

  • 谢谢。你的回答很有帮助。您实际上让我大开眼界,因为我知道 br.readLine() 具有阻塞行为,但我完全没有想到连续 3 个 readline() 让我的脚本等待所有这三个等待。也感谢您的提示。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2018-12-25
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
相关资源
最近更新 更多