【发布时间】:2014-04-21 09:47:54
【问题描述】:
我正在尝试编写一个简单的聊天应用程序,它的服务器用 C 编码,客户端用 Java 编码。我能够将数据从客户端发送到服务器,即 java 到 C,但是当我将数据从 C 中的服务器发送到 Java 中的客户端时遇到问题。这是两者的代码。 java中客户端代码的一部分
DataInputStream inDataStream;
DataOutputStream outDataStream;
String clientmessage;
String ipaddress,servermessage="";
System.out.print("Input the IP Address: ");
DataInputStream dis=new DataInputStream(System.in);
ipaddress=dis.readLine();
Socket sock=new Socket(ipaddress,PORT);
System.out.println("Server found..... ");
do
{
System.out.print("Enter your message here: ");
dis=new DataInputStream(System.in);
clientmessage=dis.readLine();
//outDataStream=new DataOutputStream(sock.getOutputStream());
//outDataStream.writeUTF(clientmessage);
PrintWriter out =new PrintWriter(sock.getOutputStream(), true);
out.println(clientmessage+"\n");
out.flush();
BufferedReader input =new BufferedReader(new InputStreamReader(sock.getInputStream()));
servermessage = input.readLine();
System.out.println("Server's message: "+servermessage);
//input.flush();
}while(!servermessage.equals("bye"));
}
}
C 中的部分服务器代码:
listen(listenfd, 10);
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
do
{
if ((num = recv(connfd, recvBuff, 1024,0))== -1) {
perror("recv");
exit(1);
}
//printf("bytes received = %d\n",num);
//recvBuff[num]='\0';
//printf("%d %d %d %d\n",recvBuff[0],recvBuff[1],recvBuff[2],recvBuff[3]);
printf("Client's message: %s\n",recvBuff);
printf("Enter your message here: ");
scanf("%s",sendBuff);
//printf("sending...... %s\n",sendBuff);
strcat(sendBuff,"\n");
if((send(connfd,sendBuff,strlen(sendBuff),0))==-1)
{
fprintf(stderr, "Failure Sending Message\n");
close(connfd);
exit(1);
}
//printf("sent...... %s\n",sendBuff);
}while(strcmp(sendBuff,"bye"));
close(connfd);
close(listenfd);
}
首先,客户端向服务器发送数据,服务器在 C 中完美接收。当 C 中的send() 向客户端发送数据时,它会逐字执行。例如,如果我发送“Hello People”,服务器首先发送“Hello”然后等待,直到那个时候客户端发送了另一条被服务器成功接收的消息。现在服务器不要求检查新字符串,而只是发送上一次的剩余数据,即 'People' 。
有人能指出哪里出错了吗? 提前致谢。
【问题讨论】:
-
仔细阅读 recv()/send() 的手册页,并了解到这两个函数不一定接收/发送尽可能多的字节,但很少。因此,循环计算此类调用,直到所有预期的数据都已接收/发送是一个好主意,而不是说必要的必要性。
-
虽然没有显示初始化套接字的代码,但我强烈怀疑是使用 raw 套接字。我相应地重新标记了这个问题。
-
另请注意,您在 C 中的发送函数不会发送终止的空字节,因为 strlen 不计算在内。
-
"...用消息测试代码...":如果不实现自己的应用程序级协议,就没有消息,就像 TCP面向流。
标签: java c sockets network-programming