我有一个客户端和一个服务器都在C中运行。我的任务是引入java程序,我在其中为C客户端创建服务器,向C服务器创建客户端。我成功地尝试正确设置连接。但问题是在两个C程序之间传递数据。以下是我在java程序中编写的内容:
while(true){
while((userInput1=br1.readLine())!=null||(userInput2=br2.readLine())!=null){
if(userInput1=!null){
bw1.write(userInput1);
bw1.flush();
}
if(userInput2=!null){
bw2.write(userInput2);
bw2.flush();
}
}
在调试上面的内容时,可以看到执行停留在第二个while语句,这意味着输入流正在等待C客户端的输入。我正在为流使用BufferedReader和BufferedWriter。 C客户端和服务器正在使用send和recv函数进行通信。 请帮助任何输入,以使Java程序帮助C程序彼此通信,而不用这样做。
答案 0 :(得分:2)
您是否正确考虑过Java的“短路”或操作员的影响?
带||如果第一个子句为真,则第二个从未被评估。
while(
(userInput1=br1.readLine())!=null ||
(userInput2=br2.readLine())!=null) {
所以你成功阅读了
userInput1=br1.readLine())!=null
然后立即进入您的处理,然后返回到while并再次读取下一行到userInput1。因此userInput2永远不会收到值。
您需要单独的逻辑,例如
read first line
read second line
但是,在阅读第2行并且数据尚未就绪时,您应该怎么做?再试一次?您读取的行是下一个预期的line2还是新的line1?为了做对,这非常棘手。
我不希望在我的协议中依赖两个单独的readlines。
答案 1 :(得分:0)
while((userInput1=br1.readLine())!=null||(userInput2=br2.readLine())!=null){
这个条件意味着在你从br2读取任何内容之前,你将一直读到br1到eOS。这是你真正想要的吗?
相反,如果你陷入br2.readLine()
,则意味着两件事:(a)br1
在EOS,(b)与br2
相关联的同伴没有发送任何内容,或者至少没有发送换行符终止的行。
当没有数据准备好被读取时,你是否正在遭受readLine()返回null的常见错觉?
此外,您正在读取由换行符终止的行,这些换行符由readLine()调用删除,然后在没有任何换行符的情况下写出来,这几乎不正确。
在我看来,你真正写的是代理,在这种情况下你需要每个插槽两个线程,一个从A读取并写入B,另一个从B读取并写入A.如果是一个代理你应该使用InputStreams和OutputStreams而不是读者和写者,因为你可能没有理由检查数据,因此你不应该通过字节 - > char和char->字节转换过程隐含使用读者和作家。在编写代理时还有其他细微之处,但在阐明代理之前我会等待你的确认。
答案 2 :(得分:0)
我使用奇偶校验字符的原因是解释流的结尾。否则只使用read()会使程序永远停止输入(即使在实际发送了所有数据之后)。我用以下方式使用ready():
//The proxy client
while(true){
if(br1.ready()){
while((temp1=br1.read())!=(int)par)
userInput1=userInput1+(char)temp1;
System.out.println("Input to Actual Server: " + userInput1);
bw1.write(userInput1);
bw1.flush();
System.out.flush();
userInput1="";
temp1=0;
}
if(br2.ready()){
while((temp2=br2.read())!=(int)par)
userInput2=userInput2+(char)temp2;
System.out.println("Response from Actual Server: " + userInput2);
userInput2=userInput2+par;
bw2.write(userInput2);
bw2.flush();
System.out.flush();
userInput2="";
temp2=0;
}
}
//The proxy server
while(true){
if(br1.ready()){
while((temp1=br1.read())!=(int)par)
userInput1=userInput1+(char)temp1;
System.out.println("Input from Actual Client: " + userInput1);
userInput1=userInput1+par;
bw1.write(userInput1);
bw1.flush();
System.out.flush();
userInput1="";
temp1=0;
}
if(br2.ready()){
while((temp2=br2.read())!=(int)par)
userInput2=userInput2+(char)temp2;
System.out.println("Response to Actual Client: " + userInput2);
bw2.write(userInput2);
bw2.flush();
System.out.flush();
userInput2="";
temp2=0;
}
}
请建议使用ready()是否有任何问题。