使用C客户机和Java服务器时,BufferedReader readLine仍被阻止
我目前正在开发一个C客户机(a),它将与一个Java服务器(B)通信,后者是RMI服务器(C)的客户机。A必须将其参数发送给B,B将把它们发送给C,C将处理它们,将它们重新发送回B,B将它们返回给A。因此,显然A必须写入套接字,然后保持阻塞状态,直到B发送回某些内容。我面临的问题是,在A写入套接字并被select()阻止后,B没有从其自身的读线中解除阻止 如果我从中删除select()和read(),一切都会正常工作。这是密码 A-client.c使用C客户机和Java服务器时,BufferedReader readLine仍被阻止,java,c,sockets,Java,C,Sockets,我目前正在开发一个C客户机(a),它将与一个Java服务器(B)通信,后者是RMI服务器(C)的客户机。A必须将其参数发送给B,B将把它们发送给C,C将处理它们,将它们重新发送回B,B将它们返回给A。因此,显然A必须写入套接字,然后保持阻塞状态,直到B发送回某些内容。我面临的问题是,在A写入套接字并被select()阻止后,B没有从其自身的读线中解除阻止 如果我从中删除select()和read(),一切都会正常工作。这是密码 A-client.c int err; err =
int err;
err = send(sockfd,(const char*)toSend,size,0);//send counter
if (err < 0){
perror("Problem encountered while sending");
exit(3);
}
//it always gets past this line
fd_set read_set;
int nb;
FD_ZERO(&read_set); //initialize variables for select
FD_SET(sockfd, &read_set);
nb = select(sockfd+1, &read_set, NULL, NULL, NULL);
if (nb!=0){
if (FD_ISSET(sockfd, &read_set)) {//if data is incoming from*/
char word[4096]="";
if (read(sockfd, word, 4096) == 0){
perror("The server terminated prematurely");
exit(4);
}
for (i=0;i<4096;i++){
printf("%c",word[i]);
}
}
}
只是想一想,试试
recv()
而不是read
。并密切注意返回值,因为它是读取的字节数,或错误为负数。换句话说,它不会返回您正在测试的单个值。注意:需要一些组件。(如中所示,您可能会以块的形式获取数据)。@WhozCraig read()和recv()除了在Windows上是相同的。@EJP在尼克斯上,它们在紧密连接时都显示为0?有趣。谢谢你的提示。(是的,它是我通常使用它们的窗口,Linux上的一些琐碎的东西)。它们在所有方面的行为都是相同的,除了某些标志,比如MSG_PEEK。查看手册页。只是想一想,尝试recv()
而不是read
。并密切注意返回值,因为它是读取的字节数,或错误为负数。换句话说,它不会返回您正在测试的单个值。注意:需要一些组件。(如中所示,您可能会以块的形式获取数据)。@WhozCraig read()和recv()除了在Windows上是相同的。@EJP在尼克斯上,它们在紧密连接时都显示为0?有趣。谢谢你的提示。(是的,它是我通常使用它们的窗口,Linux上的一些琐碎的东西)。它们在所有方面的行为都是相同的,除了某些标志,比如MSG_PEEK。看看手册页,你说得对!我将以\0结束该行,但以\n结束该行可以正常工作。谢谢你,伙计!你说得对!我将以\0结束该行,但以\n结束该行可以正常工作。谢谢你,伙计!
connection = socket1.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
//it always passes this line
String str = br.readLine();
//it passes this line only if i kill the C client or remove the read and select from the client
String[] splitStr = str.split("\\s+");
int argsLen = splitStr.length;