簡體   English   中英

C和java之間的套接字通信

[英]Socket communication between C and java

我有一個客戶端和一個服務器都運行在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程序彼此通信,就像它們沒有這樣做。

您是否正確地考慮過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。

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而不是Readers和Writers,因為您可能沒有理由檢查數據,因此您不應該通過使用Readers和Writers隱含的byte-> char和char->字節轉換過程。 在編寫代理時還有一些細微之處,但在闡明代理之前我會等待你的確認。

我使用奇偶校驗字符的原因是解釋流的結尾。 否則只使用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()有任何問題,請建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM