C和java之间的套接字通信

时间:2011-10-19 06:23:44

标签: java c sockets network-programming communication

我有一个客户端和一个服务器都在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程序彼此通信,而不用这样做。

3 个答案:

答案 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()是否有任何问题。