【发布时间】: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 Ask和minimal reproducible example。您确实需要更具体地了解您的问题是什么、您的代码的行为方式以及您期望它的行为方式。是否从任何 API 获取错误代码?是什么让您认为这段代码不起作用?
-
嗨,Jim,我在我的 java 应用程序的文本字段中输入了一个词,例如 Hello。然后我点击按钮发送。服务器没有收到任何东西。我可以看到双方的连接都连接成功。在我的服务器端的控制台上打印出“已接受连接”。