簡體   English   中英

ServerSocket java沒有讀取inputStream?

[英]ServerSocket java not reading inputStream?

我寫的服務器是java這里是代碼:

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程序就打印出已發送到服務器的String ..不確定是什么正在這里發生..如果這不是一個好問題的話......

- (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

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

根據我自己的經驗, readLine不是一個好主意,特別是在使用不同的語言和平台時,更好的方法是使用InputStreamReader及其read(char[] buff)方法,並就雙方的長度達成一致。每次發送。

再說一次,我沒有提到這一點,只有我的經驗。

另外,查看代碼,發送一個沒有換行符號的字符串: [socket sendString:@"Hi This is a second test"]; 也許在最后添加\\n將為您解決它。

BufferedReader可能很危險; 如果您一次只讀取少量數據,或者數據來自網絡,則緩沖可能會導致短線“卡住”。 如果您只使用BufferedReader來獲取readLine() ,那么執行以下操作:

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

額外的參數將緩沖區大小設置為1個字符,從而有效地將其關閉。 這通常可以解決這類問題。

暫無
暫無

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

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