Java客户端从C服务器接收,但C服务器不从Java客户端接收

时间:2017-07-24 04:39:38

标签: java c sockets tcp

我在C中创建了一个简单的服务器,在Java中创建了一个简单的客户端,作为大型应用程序中的功能的替身。我能够将客户端连接到服务器,客户端能够从服务器接收消息。但是,当我尝试从服务器中的客户端收到消息时,我什么也得不到。经过一些研究,我相信我的客户应该工作,所以我觉得这个问题必须在接收方,但我真的不确定问题是什么,因为我基本上使用了相同的C其他应用程序的代码没有问题。如果有人可以帮我解决这个问题,我会非常感激。

这是简单的Java代码:

public static void main(String[] args) {
    try{
        Socket sock = new Socket("localhost",9000);
        BufferedReader inputBuffer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        String line = inputBuffer.readLine();
        System.out.println("From server : "+line);
        PrintWriter out = new PrintWriter(sock.getOutputStream());
        String toSend = "I am sending you a message. I sure hope you get it.\n";

        out.write(toSend.toCharArray());
        out.flush();
        out.close();
    }catch(Exception e)
    {

    }

这是我的C代码:

int main(int argc, char** argv) {

int port = 9000;
int buffer_size = 256;

int sock;
int new_sock;
socklen_t client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
char* line_status;
int len;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
    printf("Couldn't open socket.\n");
}

bzero((char*) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(port);

int status = bind(sock, 
                  (struct sockaddr *) & server_address, 
                  sizeof(server_address));

if(status < 0)
{
    printf("Error binding to socket.\n");
}

listen(sock, 5);
client_len = sizeof(client_address);
printf("Listening for clients on port %d...\n", port);
new_sock = accept(sock, 
                  (struct sockaddr *) &client_address, 
                  &client_len);

if(new_sock < 0)
{
    printf("Error accepting connection.\n");
}else
{
    printf("Connected\n");
    char outbuffer[] = "123456789\n";

    int write_stat = write(new_sock, outbuffer, 10);
    printf("wrote message to socket\n");

    char buffer[buffer_size];
    int read_stat = 0;
    while(read_stat <= 0)
    {
        char c;
        read_stat = read(port,buffer, buffer_size);
        if(read_stat >0)
        {
            printf("read_stat = %d\n",read_stat);
            printf("received message: %s\n",buffer);
        }

    }
    printf("done\n");

}
return 0;

}

1 个答案:

答案 0 :(得分:2)

您不想阅读“端口号”

... = read(port,buffer, buffer_size);

但是来自接受的套接字

... = read(new_sock, buffer, buffer_size);

提示如果您已添加完整的错误检查处理来调用read()您已立即偶然发现了这个bug。错误检查是免费调试的!

与您的特定问题无关的说明:代码使用socklen_t我得出结论,您在Windows上。因此read()write() 很可能返回ssize_t 而不是 int