服务端、客户端若是一次性交互,而这次交互的数据比较多,需要用到while循环的时候,用read判断的话会导致,即使数据完了还是会阻塞状态,这样之后,客户端和服务端都进入了等待状态。
其实在InputStream中,可以不通过read()方法判断流数据是否到达末尾,而通过available()判断,若available()!=0,流数据就未到达末尾,而它不是阻塞式方法,一次性交互的时候用这个判断可以避免进入等待状态
演示代码:- /*
- 服务端
- */
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- class TcpServer
- {
- public static void main(String[] args) throws Exception
- {
- ServerSocket ss = new ServerSocket(10000);
- Socket s = ss.accept();
- InputStream is = s.getInputStream();
- String ip = s.getInetAddress().getHostAddress();
- System.out.println(ip);
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=is.available())!=0) //判断流对象数据是否到达末尾
- {
- len=is.read(buf);//获取流对象数据长度
- String str = new String(buf,0,len);
- System.out.println(str);
- }
- PrintWriter os = new PrintWriter(s.getOutputStream(),true);
- os.println("send to client");
- s.close(); //关闭客户端对象
- ss.close(); //关闭服务器 这里可选,可关可不关
- }
- }
- /*
- 客户端
- */
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.net.Socket;
- class TcpClient
- {
- public static void main(String[] args) throws Exception
- {
- Socket s = new Socket("192.168.2.100",10000);
- PrintWriter os = new PrintWriter(s.getOutputStream(),true);
- os.println("send to server");
- InputStream is = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = 0;
- while((len=is.read(buf))!=-1) //这里用这种循环其实也会进入等待状态,而因为服务器端传回“send to client”后就把s.close()关了,所以这里就算等待也会被结束掉。
- {
- System.out.println(new String(buf,0,len));
- }
- s.close();
- }
- }
复制代码 关于上面的等待问题,本来想了很久 ,一直没有实现,后来查看InputStream的描述才想到了这个办法,这种代码演示又不像键盘录入可以判断输入了什么从而结束while的循环,所以感觉就只能通过这种方法实现了,如果有更好的方法,欢迎交流。
|