java - 在套接字上发送和接收

标签 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 (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_Request。

问题出在哪里?

最佳答案

存在概念问题。您认为 TCP 是面向消息的(发送指定长度的消息)。事实并非如此,它仅提供字节流。

为了发送指定长度的消息,常见的技术是首先发送长度(以固定长度编码,例如网络字节顺序的 4 字节整数),然后发送实际消息。

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

关于java - 在套接字上发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10061419/

相关文章:

c - 为什么 scanf() 需要 "%lf"来表示 double ,而 printf() 只需 "%f"就可以了?

node.js - Nodejs,如何检测关闭的套接字?

Java 客户端 SSLSocket : How to tell if remote end has closed the connection?

java - PropertySourcesPlaceHolderConfigurer 与 PropertyOverrideConfigurer 等效

Java二分查找计数比较次数

java - 我们如何通过Jpa获取完整的分层数据列表

java - 以不同的方式在java中拆分字符串

c - 在C中检测txt文件的EOF

c++ - C++ 可执行文件中哪个部分存储全局 const 变量?

java - 在断开连接的套接字上写入不会抛出