最近在做一些关于网络方面的开发,常用到java中流的读取,其中有一个问题困扰了我好久,就是流的阻塞和返回-1的问题。
案例1、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
byte[] buffer= new byte[4];
int len=-1;
len=is.read(buffer);
System.out.println(new String (buffer,0,len)+" "+len);
len=is.read(buffer);
System.out.println(new String(buffer,0,len)+" "+len);
System.out.println("server over 1");
}
}
package io;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 4887);
OutputStream out= socket.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
out.write(line.getBytes());
out.flush();
// out.close();
Thread.sleep(100000);
}
}
数据:
client输入
abcdef
server输出
abcd 4
ef 2
server over 1
client输入
abcd
server输出
abcd 4
案例2、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
byte[] buffer= new byte[4];
int len=-1;
while((len=is.read(buffer))!=-1){
System.out.println(new String (buffer,0,len)+" "+len);
}
System.out.println("server over 1");
}
}
package io;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 4887);
OutputStream out= socket.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
out.write(line.getBytes());
out.flush();
// out.close();
Thread.sleep(100000);
}
}
数据:
client输入
abcdef
server输出
abcd 4
ef 2
client输入
abcd
server输出
abcd 4
案例3、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
System.out.println(1+" "+is.read());
System.out.println(2+" "+is.read());
System.out.println(3+" "+is.read());
System.out.println(4+" "+is.read());
System.out.println(5+" "+is.read());
System.out.println("server over 1");
}
}
package io;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 4887);
OutputStream out= socket.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
out.write(line.getBytes());
out.flush();
Thread.sleep(100000);
}
}
数据:
client输入
abcd
server输出
1 97
2 98
3 99
4 100
案例4、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
int t=-1;
while((t=is.read() )!=-1){
System.out.println(t);
}
System.out.println("server over 1");
}
}
package io;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 4887);
OutputStream out= socket.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
out.write(line.getBytes());
out.flush();
// out.close();
Thread.sleep(100000);
}
}
数据:
client输入
abcdef
server输出
97
98
99
100
101
102
案例5、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
int t=-1;
while((t=is.read() )!=-1){
System.out.println(t);
}
System.out.println("server over 1");
}
}
package io; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 4887); OutputStream out= socket.getOutputStream(); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); String line=br.readLine(); out.write(line.getBytes()); out.flush(); out.close(); Thread.sleep(100000); } }
数据:
client输入
abcdef
server输出
97
98
99
100
101
102
server over 1
案例6、
看代码:
package io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket = new ServerSocket(4887);
Socket client= serverSocket.accept();
InputStream is= client.getInputStream();
int t=-1;
while((t=is.read() )!=-1){
System.out.println(t);
}
System.out.println("server over 1");
t=-1;
while((t=is.read() )!=-1){
System.out.println(t);
}
System.out.println("server over 2");
}
}
package io;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 4887);
OutputStream out= socket.getOutputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String line=br.readLine();
out.write(line.getBytes());
out.flush();
out.close();
out= socket.getOutputStream();
out.write("def".getBytes());
out.flush();
out.close();
Thread.sleep(100000);
}
}
数据:
client输入
abcdef
Exception in thread "main" java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:828)
at io.Client.main(Client.java:18)
server输出
97
98
99
100
101
102
server over 1
server over 2
总结:除了在最后两个案例中关闭流时,一直没有返回-1