【问题标题】:Socket Programming between C server and Java clientC服务器和Java客户端之间的Socket编程
【发布时间】:2018-01-25 03:51:26
【问题描述】:

我正在尝试编写一个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。

附加信息:两段代码的编译都没有错误。 客户端和服务器之间的连接可以成功建立。 服务器端的输出打印 Message received:。没有我从客户端应用程序发送的字,它是空的。

【问题讨论】:

  • 我注意到你使用了BufferedWriter。你对缓冲了解多少?
  • 再次检查您的端口号
  • "c 服务器无法从客户端服务器接收数据" -- 你必须更清楚这意味着什么正是
  • 请拨打tour,阅读How to Askminimal reproducible example。您确实需要更具体地了解您的问题是什么、您的代码的行为方式以及您期望它的行为方式。是否从任何 API 获取错误代码?是什么让您认为这段代码不起作用?
  • 嗨,Jim,我在我的 java 应用程序的文本字段中输入了一个词,例如 Hello。然后我点击按钮发送。服务器没有收到任何东西。我可以看到双方的连接都连接成功。在我的服务器端的控制台上打印出“已接受连接”。

标签: java c sockets


【解决方案1】:

在打印“收到的消息”之前,您的 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);

在循环内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多