我在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;
}
答案 0 :(得分:2)
您不想阅读“端口号”
... = read(port,buffer, buffer_size);
但是来自接受的套接字
... = read(new_sock, buffer, buffer_size);
提示:如果您已添加完整的错误检查和处理来调用read()
您已立即偶然发现了这个bug。错误检查是免费调试的!
与您的特定问题无关的说明:代码使用socklen_t
我得出结论,您在Windows上不。因此read()
和write()
很可能返回ssize_t
而不是 int
。