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

通过套接字Java发送字节数组、字符串和字节

连坚白
2023-03-14

我需要通过Java socket发送一个文本消息到服务器,然后发送一个字节数组,然后是一个字符串等等。到目前为止,我所开发的内容还在工作,但客户端只读取发送的第一个字符串。

从服务器端:我使用BufferedOutputStream发送字节数组,使用PrintWriter发送字符串。

问题是客户机和服务器不同步,我的意思是服务器发送字符串然后字节数组然后字符串,而不等待客户机消耗每个需要的字节。

我的意思是情况不是这样的:

Server        Client 
Send String   read String
Send byte     read byte
Server        Client
Send String   
Send byte
Send String   
Send byte 

               read String   
               read byte
               read String   
               read byte
   // Send String to Client
    // --------------------------------------------------------------------
    public  void sendStringToClient (
                         String response, 
                         PrintWriter output) {
    try {
        output.print(response); 
        output.flush();

    } catch(Exception e) {
        e.printStackTrace();
    }
    System.out.println("send Seeder String : " + response);
    }

    // Send Byte to Client
    // --------------------------------------------------------------------
    public  void sendByteToClient (
                           byte[] response, 
                           BufferedOutputStream output) {
    try {
        output.write(response, 0, response.length); 
        //System.out.println("send : " + response);
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
 public byte[] readInByte(int size) {

byte[] command = new byte[size];    
try {
    this.inByte.read(command);
} catch (IOException e) {
    e.printStackTrace();
}
return command;
}

public String readInString(int size) {
char[] c = new char[size];
try{
    this.inString.read(c, 0, size);
} catch (IOException e) {
    e.printStackTrace();
}
return String.valueOf(c);
}

共有1个答案

邹阳
2023-03-14

可能有用的一点是,我确切地知道要读取的每个字符串和要读取的每个字节数组的大小。

完全正确。这很常见。基本上,您为每个消息添加长度前缀,并且您可能希望提供更多的头信息(例如,是字符串还是字节数组消息)。

您可以将消息长度(始终以字节为单位)表示为固定的字节数(例如,假设您永远不需要超过4GB的消息,则为4个),或者使用7位编码的整数(其中您在每个字节中发送长度的7位,顶部的位只是指示这是否是长度的最后一个字节)。

一旦获得消息长度,就基本上设置好了--您已经有效地将数据流划分为自描述块。任务完成了。

(顺便说一下,由于PrintWriter具有吞噬异常的特性,我将避免使用它。但是,在执行此操作时,您实际上并不需要writer,因为您可能希望将每个字符串转换为字节数组,以便在发送之前以字节计算其长度。请记住指定编码!)

 类似资料:
  • 问题内容: 我如何使用getOutputStream方法发送一个strin。正如他们提到的,它只能发送字节。到目前为止,我可以发送一个字节。但不是字符串值。 提前致谢 问题答案: 如何使用PrintWriter: 编辑 :找到了我自己的答案,看到讨论了一个改进,但未列出。这是使用OutputStreamWriter编写字符串的更好方法:

  • 问题内容: 我有两个脚本,Server.py和Client.py。我有两个目标: 为了能够一次又一次地从客户端向服务器发送数据。 为了能够将数据从服务器发送到客户端。 这是我的Server.py: 这是我的客户: 该函数首次运行(“ e”进入服务器,我返回返回消息),但是如何使它一遍又一遍地发生(类似于聊天应用程序)?该问题在第一次之后开始。消息不会在第一次之后发送。我究竟做错了什么?我是pyth

  • 我在将JSON对象转换为字节时遇到了一个问题。我需要这样的东西: 我将感激任何帮助。提前道谢。

  • 问题内容: 我试图理解一个到字符串,一个的字符串表示形式到转换…我将我的转换成一个要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显给客户端。 当我从Java应用程序发送数据时… 字节发送.. 发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示形式,该数据将通过电线发送): 在python端,python服务器将字符串返回给调用方(我可以

  • 为什么数组不相等?我希望返回原始的字节数组。

  • 出于某些原因,我需要通过服务器套接字分别发送多个字节数组,客户端套接字将接收这些字节数组。发送字节数组后,发现客户端套接字接收的字节数组与服务器套接字接收的字节数组不相等。如果我使用ObjectOutputStream和ObjectInputStream,那么一切都很好,但是根据我的需要,我不能使用ObjectOutputStream和ObjectInputStream,因为我的服务器需要连接两个