gpt4 book ai didi

java - C服务器与Java客户端之间的Socket编程

转载 作者:行者123 更新时间:2023-11-30 14:51:15 25 4
gpt4 key购买 nike

我正在尝试编写一个c语言服务器和一个java客户端来发送消息。

我能够成功连接客户端和服务器。然而,c服务器无法接收来自客户端服务器的数据。

我想要得到的预期结果是。

1)启动服务器

2)启动客户端应用程序

3) 用户在文本字段中输入一些单词,然后单击“发送”。

4)然后服务器端接收我从客户端发送的字符串。

是否存在某种我错过的编码错误或数据不匹配?我想获得一些有关为什么服务器端未收到数据的帮助。谢谢!

我的java客户端代码中使用的基本代码是:

private Socket socket;
private static final int SERVERPORT = 4000;
private static final String SERVER_IP = "192.168.8.112";

InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);

在java应用程序中,我有一个文本字段供用户输入数据:

public void onClick(View view) {
try {
EditText et = (EditText) findViewById(R.id.EditTextT);

String str = et.getText().toString();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println(str);

}
}

在我的服务器代码中,我使用了 here 中的代码

#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write

int main(int argc , char *argv[])
{
int socket_desc , client_sock , c , read_size;
struct sockaddr_in server , client;
char client_message[2000];

//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
puts("Socket created");

//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 4000 );

//Bind
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
perror("bind failed. Error");
return 1;
}
puts("bind done");

//Listen
listen(socket_desc , 3);

//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);

//accept connection from an incoming client
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);
if (client_sock < 0)
{
perror("accept failed");
return 1;
}
puts("Connection accepted");

//Receive a message from client
while( (read_size = recv(client_sock , client_message , 2000 , 0)) > 0 )
{
//Send the message back to client
write(client_sock , client_message , strlen(client_message));
}
printf("Message received: %s\n",client_message);
if(read_size == 0)
{
puts("Client disconnected");
fflush(stdout);
}
else if(read_size == -1)
{
perror("recv failed");
}

return 0;
}

编辑注释:我将8888更改为4000。

附加信息:这两段代码的编译都没有错误。客户端与服务器端可以成功建立连接。服务器端的输出打印收到消息:。它是空的,没有我从客户端应用程序发送的单词。

最佳答案

您的 C 代码正在读取直到流结束,然后才会打印“消息已收到”。

您的 Java 代码没有关闭套接字。

所以 C 代码永远不会看到流结束。

所以它永远不会打印“消息已收到”。

这并不能证明没有收到消息。

此外,您的 C 代码正在将消息发送回客户端,而客户端似乎没有从套接字读取消息,因此最终 C 代码将在 send() 处阻塞。 .

因此,您要做的第一件事是在接收循环内打印“收到消息”,而不是在循环终止时打印。

其次,这个:

write(client_sock , client_message , strlen(client_message));

是错误的。不保证尾随为空。应该是:

write(client_sock , client_message , read_size);

类似这样:

printf("Message received: %s\n",client_message);

应该是:

printf("Message received: %.*s\n",read_size,client_message);

在循环内。

关于java - C服务器与Java客户端之间的Socket编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48435367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com