gpt4 book ai didi

Java TCP 客户端发送被阻止?

转载 作者:可可西里 更新时间:2023-11-01 02:47:41 25 4
gpt4 key购买 nike

我正在编写一个与 C 服务器通信的 java TCP 客户端。我必须在两者之间交替发送和接收。这是我的代码。

  1. 服务器将二进制msg(len)的长度发送给客户端(java)
  2. 客户端发送一个“ok”字符串
  3. 服务器发送二进制文件,客户端分配一个“len”字节的字节数组来接收它。
  4. 它再次发回“ok”。

第 1 步有效。我得到“len”值。然而,客户端“发送受阻”,服务器等待接收数据。

谁能看一下。

在我定义的 try block 中:

            Socket echoSocket = new Socket("192.168.178.20",2400);
OutputStream os = echoSocket.getOutputStream();
InputStream ins = echoSocket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ins));

String fromPU = null;


if( (fromPU = br.readLine()) != null){
System.out.println("Pu returns as="+fromPU);

len = Integer.parseInt(fromPU.trim());
System.out.println("value of len from PU="+len);

byte[] str = "Ok\n".getBytes();
os.write(str, 0, str.length);
os.flush();

byte[] buffer = new byte[len];
int bytes;
StringBuilder curMsg = new StringBuilder();
bytes =ins.read(buffer);
System.out.println("bytes="+bytes);
curMsg.append(new String(buffer, 0, bytes));
System.out.println("ciphertext="+curMsg);
os.write(str, 0, str.length);
os.flush();
}

更新:

这是我的代码。目前,两边都没有 recv 或 send 阻塞。但是,无论是 Buffered Reader 还是 DataInput Stream reader,我都无法发送 ok 消息。在服务器端,我得到了大量的字节而不是 2 个字节的 ok。

            Socket echoSocket = new Socket("192.168.178.20",2400);
OutputStream os = echoSocket.getOutputStream();
InputStream ins = echoSocket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ins));
DataInputStream dis = new DataInputStream(ins);
DataOutputStream dos = new DataOutputStream(os);
if( (fromPU = dis.readLine()) != null){
//if( (fromPU = br.readLine()) != null){
System.out.println("PU Server returns length as="+fromPU);
len = Integer.parseInt(fromPU.trim());
byte[] str = "Ok".getBytes();
System.out.println("str.length="+str.length);
dos.writeInt(str.length);
if (str.length > 0) {
dos.write(str, 0, str.length);
System.out.println("sent ok");
}
byte[] buffer = new byte[len];
int bytes;
StringBuilder curMsg = new StringBuilder();
bytes =ins.read(buffer);
System.out.println("bytes="+bytes);
curMsg.append(new String(buffer, 0, bytes));
System.out.println("binarytext="+curMsg);

dos.writeInt(str.length);
if (str.length > 0) {
dos.write(str, 0, str.length);
System.out.println("sent ok");
}

最佳答案

在流周围使用 BufferedReader 然后尝试从流中读取二进制数据是个坏主意。如果服务器实际上一次性发送了所有数据,并且BufferedReader 读取了二进制数据及其返回的行,我不会感到惊讶。

你能控制协议(protocol)吗?如果是这样,我建议您将其更改为以二进制(例如固定的 4 个字节)发送数据的长度,这样您就不需要弄清楚如何在文本和二进制之间切换(这是基本上是一种痛苦)。

如果你不能这样做,你可能需要一次读取一个字节开始,直到你看到代表 \n 的字节,然后转换你读到的内容转换为文本,解析它,然后将其余部分作为一个 block 读取。这有点低效(一次读取一个字节而不是一次读取缓冲区),但我认为此时读取的数据量非常小。

关于Java TCP 客户端发送被阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com