2011-08-07 58 views
0

我寫了一個服務器是用java這裏是代碼:ServerSocket java不讀取inputStream?

public mainClass() 
{ 
    try 
    { 
     ss = new ServerSocket(8080); 

     while (true) 
     { 
      socket = ss.accept(); 
      System.out.println("It is accept!"); 

      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      //out = new PrintWriter(socket.getOutputStream(),true); 

      line = in.readLine(); 
      System.out.println("you input is :" + line); 
      //out.close(); 
      in.close(); 
      socket.close(); 

     } 

    } 
    catch (IOException e) 
    { 

    } 

,我使用iPhone應用程序的客戶端。 現在我的問題是,服務器沒有讀取輸入流,而應用程序正在iphone上運行..但只要應用程序被終止,Java程序打印出已發送到服務器的字符串..不確定什麼是here..sorry發生的事情,如果這不是一個好問題..

- (void)viewDidLoad { 
[super viewDidLoad]; 

socket = [[LXSocket alloc]init]; 

if ([socket connect:@"10.211.55.2" port:8080]) { 

    NSLog(@"socket has been created"); 
} 
else { 
    NSLog(@"socket couldn't be created created"); 
} 

@try { 

[socket sendString:@"Hi This is a second test"]; 
} 

@catch (NSException * e) { 
NSLog(@"Unable to send data"); 
} 


    [super viewDidLoad]; 

}

感謝, TC

+0

你能展示在iPhone上運行的相關代碼嗎(我認爲Objective C)? – MByD

+0

添加了一些代碼... –

回答

1

從我自己的經驗,readLine是不是一個好主意,尤其是在不同的語言和平臺工作時,更好的方法將是使用InputStreamReader及其read(char[] buff)方法,並同意雙方關於長度發送每個時間。

再一次,我沒有提到那個,只有我的經驗。

另外,看着你的代碼,你發送一個沒有新行字符的字符串:[socket sendString:@"Hi This is a second test"];也許在最後加上\n會爲你解決它。

+0

謝謝先生...只需要添加一個新行.. –

+0

如果你打開一個新的問題會更容易,請顯示雙方的代碼,如果你有錯誤日誌任何。我可能不會回答這個問題,因爲我已經超過34個小時了,而且我開始感覺有點累了:) – MByD

0

BufferedReader可能是危險的;如果您一次只讀取少量數據,或者數據通過網絡傳輸,則緩衝可能導致短線「卡住」。如果你只使用BufferedReader得到readLine(),那麼這樣做:

new BufferedReader(new InputStreamReader(socket.getInputStream()), 1); 

這額外的參數設置緩衝區大小爲1個字符,有效地將其關閉。這通常解決了這種問題。

1

我的猜測是客戶端應用程序在它發送的字符串末尾沒有發送任何換行符。因此,BufferedReader.readLine()等待EOL字符,並且只在客戶端應用程序結束時才返回字符串,因爲此時連接已關閉,讀者知道永遠不會有EOL字符串,並且該字符串是最後一行接收。