Vin*_*igh 5 java sockets inputstream java.util.scanner
当我Socket.getInputStream()直接使用数据(没有像Scanner这样的接口)时,它不会阻塞.但是,当我尝试使用扫描仪(类似于我们收到字符串的方式System.in)时,确实如此.我想知道这个的原因,以及连接的Socket提供给你的InputStream是如何与InputStream inin 不同的System.
用于测试的客户端(用于两个服务器)
挂起的代码:
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(15180);
Socket socket = ss.accept();
Scanner scanner = new Scanner(socket.getInputStream());
//read data from client
while(true) {
String data = scanner.nextLine();
System.out.println("Received data!");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
不阻止的代码:
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(15180);
Socket socket = ss.accept();
//read data from client
while(true) {
int data = socket.getInputStream().read();
System.out.println("Received data!");
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
(我想你已经想到了这个但是...)
该readLine()方法返回当前行的其余部分.也就是说,所有未消耗的字符直到下一个"行尾"序列,或者"流的结束",它始终是第一个.它将阻塞,等待当前行(根据上述)可用.
因此,如果你的套接字readLine()调用阻塞,它正在等待远程发送行结束标记(例如'\n'),或者关闭它的套接字输出流(这将导致"结束流") .
问:当你从控制台阅读时,为什么它"起作用"?
答:无论何时按Enter键,控制台都会向流添加"行尾"序列.(确切地说,添加的序列是依赖于操作系统的,但是Scanner该类将处理所有常见的变种,以及一些不常见的变种.)
这里的教训是,只应Scanner.readLine()在输入流是面向行的情况下使用; 即如果写入/生成的流包括"行尾"标记.
| 归档时间: |
|
| 查看次数: |
5998 次 |
| 最近记录: |