[英]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.