当前位置: 首页 > 知识库问答 >
问题:

我可以在关闭Socket之前通过TCP发送数据吗?

吴唯
2023-03-14

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

在批评我之前,我在写一个新的问题之前读了这个问题,但它并没有解决我的问题。下面的脚本是线程的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();
  // }
  }

}

共有1个答案

松昱
2023-03-14

你的代码运行得很好——你只需在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);

我的另一个提示是在最后的代码块中进行清理。

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

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

 类似资料:
  • 问题内容: 所以我正在使用node.js和socket.io。我有这个小程序,它接受文本框的内容并将其发送到node.js服务器。然后,服务器将其中继回其他连接的客户端。有点像聊天服务,但不完全是。 无论如何,如果用户键入价值2-10k的文本并尝试发送该文本,该怎么办?我知道我可以自己尝试一下,但是我正在寻找一个实用的最佳实践限制,即我可以通过一次发射处理多少数据。 问题答案: Node和sock

  • 我正在向我的远程服务器发送以将其存储在文件系统中。为此,我使用Java协议。为了避免网络带宽和TCP输入/输出缓冲内存,我以压缩格式发送数据。但是,我无法解压缩从客户端收到的数据。我得到了ZLIB输入流的异常。这是因为服务器正在接收。 Java代码 客户 服务器 有没有办法在Socket中以GZIP压缩格式发送数据?

  • 问题内容: 我被困住了:我试图使用AJAX提交表单,但是我找不到通过我的AJAX调用发送多个数据字段的方法。 我尝试了各种东西: 甚至是出于测试目的的东西: 但是无论我怎样尝试,我的SQL都一无所获。 那么,在我的AJAX调用中放入更多行数据的正确语法是什么? 问题答案: 正确的语法是: 如此处指定:http : //api.jquery.com/jQuery.ajax/ 因此,如果这不起作用,我

  • 我创建了某种类型的客户机/服务器应用程序,它有自己的数据ACK系统。由于某些限制,它最初是用TCP编写的,但它的基础是考虑到UDP编写的。 我发送到服务器的数据包有自己的封装(数据包id和数据包大小报头。我知道UDP还有一个校验和,所以我没有为此添加报头),但是TCP是如何工作的,我知道服务器可能接收不到整个数据包,所以我收集并缓冲了接收到的数据,直到收到一个完整的有效数据包。 我想知道的是:如果

  • 问题内容: 我有一个内置的javascript,它可以执行以下操作:通过ajax-> php-> sql获取内容,并在单击内容后在index.php上显示它,将显示新内容。 现在,我想拥有一个在将内容单击到php之后发送数据的函数,该函数将在db中执行某些操作。如何创建将发送数据的功能?谢谢! 这是我的显示内容的代码: }); }` 问题答案: 您可以通过在jQuery.ajax 设置中包含值,将