Java 在套接字上发送和接收

Java 在套接字上发送和接收,java,c,sockets,Java,C,Sockets,我制作了一个java套接字服务器和c套接字客户端,下面是代码 Java套接字服务器: int Send_Request(String s) { try { os = socket.getOutputStream(); os.write(s.getBytes()); os.flush(); Log.d(tag,"Data = " + s); return 0; } catch (IOExcepti

我制作了一个java套接字服务器和c套接字客户端,下面是代码

Java套接字服务器:

int Send_Request(String s) {

    try {
        os = socket.getOutputStream();
        os.write(s.getBytes());
        os.flush();

        Log.d(tag,"Data = " + s);

        return 0;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        Log.e(tag,"Send Request Error");
        return -1;
    }
C套接字客户端:

void* recv_request()
{
int i,in;
char buf[1024];
while(1)
{
    if ( ( in = read(sockfd, buf, strlen(buf)) ) != -1 )
    {
        LOGD("Received = %s ...",buf);
        sendServerCutText(buf);
        memset(buf,0,strlen(buf));
    }

}
}

问题是。。当我从服务器发送时,它在flush()上阻塞,c客户机无法接收,直到调用另一个send_请求


问题在哪里?

有一个概念上的问题。您认为TCP是面向消息的(发送指定长度的消息)。它不是那样的,它只是提供一个字节流

要发送具有指定长度的消息,一种常见的技术是先发送长度(以固定长度编码,如网络字节顺序的4字节整数),然后发送实际消息


还有一个实现问题,read的第三个参数应该是最大读取长度,应该是1024,在未初始化的本地字符数组上执行
strlen
显然是未定义的行为。

除非
buf
包含C样式的字符串,否则不能调用
strlen(buf)
。您正在接收任意二进制数据,而不是C样式的字符串。你甚至在没有任何数据之前就给strlen打电话!如果发送前长度未知,或者消息格式必须为文本格式,也可以发送特殊的字节或字符序列作为消息之间的分隔符。对于像telnet这样的协议,换行符是一个自然的消息分隔符。HTTP使用长度的字符串表示。我添加os.write(s.length())对吗;在操作系统写入(s.getBytes())之前,先读取(sockfd,buflen,4),然后再读取(sockfd,buf,??)
os.write(s.length())-如果服务器和客户端计算机的端号相同,则为“是”,否则必须强制执行端号。。。(例如:)。2) 是的,首先读取长度,然后在下一次调用中使用该长度。我已将s.length()更改为4字节的整数,然后通过os.write(intToBytesArray(s.length())发送,c客户端读取(sockfd,buf_len,4),但它仍然在os.write()上阻塞,我写的是什么问题?