android与网络(中)socket的陷阱
16lz
2021-01-23
有时候我们需要像Ajax那样,用户一输出就会在服务器返回输出的结果比如用户输出123,控制台上面就输出123,紧接着用户输出234,控制台上面就是234,当然,代码写起来并不困惑:
public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(6666); Socket client=server.accept(); BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream())); while(true){ String str=in.readLine(); System.out.println(str); if(str.equals("end")) break; } client.close(); } }public class ClientSocket{ static Socket server; public static void main(String[] args)throws Exception{ server=new Socket(InetAddress.getLocalHost(),6666); PrintWriter out=new PrintWriter(server.getOutputStream()); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); while(true){ String str=wt.readLine(); out.println(str); //这里一定要注意刷新流out.flush(); if(str.equals("end")){ break; } } server.close(); } }
好了,开始运行,输入123,控制台马上返回123,然后继续输入456,发现控制台没有反应。再输,还是没有反应。有的同学会怀疑代码有错误,认为在while循环中System.out.println(str)这句话没有执行,然后头就大了。其实这段代码是完全没有错的,原因在于其实你运行了两个程序,在第二次运行的时候eclipse的控制台是交给了服务端,所以你在控制台上的操作实际上是对服务端的操作,当然不会起作用。
如果要起作用,代码这样写:
public class MyServer { public static void main(String[] args) throws IOException{ ServerSocket server=new ServerSocket(6666); Socket client=server.accept(); BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true){ String str=in.readLine(); System.out.println(str); out.println("has receive...."); out.flush(); if(str.equals("end")) break; } client.close(); } }public class ClientSocket{ static Socket server; public static void main(String[] args)throws Exception{ server=new Socket(InetAddress.getLocalHost(),6666); BufferedReader in= new BufferedReader(new InputStreamReader(server.getInputStream())); PrintWriter out=new PrintWriter(server.getOutputStream()); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); while(true){ String str=wt.readLine(); out.println(str); out.flush(); if(str.equals("end")){ break; } System.out.println(in.readLine()); } server.close(); } }
这样做的结果是控制台一直客户端手里,服务器返回数据到客户端的控制台。当输入一个字符后会立即显示。当输入end的时候,客户端被断开,服务器端获得控制台,所以你才会看见“所有的数据被一起显示了”。
更多相关文章
- 通过Android 客户端上传数据到服务器
- repo sync同步Android 源代码下载到99%出错
- 【Android Studio快捷键】之代码提示
- 使用calabash测试开源中国Android客户端
- Android的strings.xml不在代码显示转html原生就支持的部分html语