0

大家好,我的朋友们,

我正在尝试通过套接字连接发送一个长字符串,但我将它们分为两部分,所以在执行我的过程时出现错误。

在客户端我发送文件,

BufferedWriter bufferedOut = null;
BufferedReader in = null;
socket = new Socket("192.168.0.15",4444);
bufferedOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

bufferedOut.write(xmlInString, 0, xmlInString.length());

/**
* wait for response
*/

byte[] buf = new byte[10000];
int actualNumberOfBytesRead = socket.getInputStream().read(buf);
String responseLine = new String(buf, 0, actualNumberOfBytesRead);

在服务器中,

 BufferedReader in = null;
 PrintWriter out = null;
 in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 out = new PrintWriter(client.getOutputStream(), true);

//get the input
 byte[] buf = new byte[10000];
 int actualNumberOfBytesRead = client.getInputStream().read(buf);
 line = new String(buf, 0, actualNumberOfBytesRead);
 //send back
 out.println(result);

我怎样才能把我的字符串作为一部分?你能告诉我我的代码错误在哪里吗?

谢谢你们

4

2 回答 2

1

您将需要一个循环来重复从输入流中读取,每次将读取的数据连接在一起,直到到达字符串的末尾。

编辑 - 更多细节。如果您正在考虑传输多个此类字符串/文件,请参阅@arnaud 的答案。如果您希望发送 1 个大字符串,那么:

  1. 在发送方,创建输出流,发送数据(如您所做的那样),然后不要忘记再次关闭流(这也将执行刷新以确保数据通过线路发送,并通知没有更多数据的另一端)。

  2. 在接收方站点上,循环读取数据直到输入流结束(read(buf) 返回 -1),每次将数据连接到一个大缓冲区中,然后关闭输入流。

另外,请阅读我关于将文件作为字节而不是字符串发送的评论。这对于 XML 文件尤其重要,因为它有相当特殊的编码检测规则。

于 2011-10-12T15:03:35.113 回答
1

使用 TCP 套接字时,您正在处理“流”。也就是说,默认情况下消息之间没有分隔符。按照您的操作,您可能会阅读部分信息,或者更糟的是,您可能会阅读更多信息。

最常见的方法是分隔您的消息。您可以使用 DataInputStream/DataOutputStream 将字符串编码为字节并使用第一个字节来指示它的长度。这样,它就知道它应该在接收端读取多少字节。

    DataOutputStream out = null;
    DataInputStream in = null;
    Socket socket = new Socket("192.168.0.15",4444);
    out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
    in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

    out.writeUTF(xmlInString);
    out.flush(); // to ensure everything is sent and nothing is kept in the buffer.

    // wait for response

    String responseLine = in.readUTF();

然后,相应地调整服务器代码。

当使用Buffered带有套接字的输出时,出于性能原因建议这样做,建议flush()在您编写消息后确保所有内容都实际通过网络发送并且没有任何内容保存在缓冲区中。

您最初的问题可能是因为您的消息需要多个 TCP/IP 数据包,并且在您的服务器中,您只读取了刚刚到达的第一个数据包。

于 2011-10-12T15:10:36.140 回答