java read bytes 阻塞_关于java socket中的read方法阻塞问题

客户端:

public class TCPClient {

public static void main(String[] args) throws IOException {

FileInputStream fis=new FileInputStream("E:\\Trump.jpg");

Socket socket=new Socket("127.0.0.1",8888);

OutputStream os=socket.getOutputStream();

byte[] bytes=new byte[1024];

int len;

while((len=fis.read(bytes))!=-1){

//将读取到的数据传输到客户端与服务器端之间的IO流

os.write(bytes,0,len);

}

//读服务器回写的数据

InputStream is=socket.getInputStream();

len=is.read(bytes);

System.out.println(new String(bytes,0,len));

socket.close();

fis.close();

}

}

服务器端:

public class TCPServer {

public static void main(String[] args) throws IOException {

ServerSocket server=new ServerSocket(8888);

Socket socket=server.accept();

InputStream is=socket.getInputStream();

FileOutputStream fos=new FileOutputStream("E:\\Test\\Trump.jpg");

int len;

byte[] bytes=new byte[1024];

while ((len=is.read(bytes))!=-1) {

fos.write(bytes,0,len);

}

OutputStream os=socket.getOutputStream();

os.write("文件上传完毕!".getBytes());

fos.close();

socket.close();

}

}

这段代码执行以后会发现server类 read()方法发生了阻塞,经过查找资料发现read()是一个阻塞函数(阻塞函数就是当这个函数不执行完,函数所在线程就一直停止在这里不动。)。

在输入数据可用、检测到流末尾或者抛出异常前,read方法一直阻塞。如果客户端没有声明断开outputStream那么它就会认为客户端仍旧可能发送数据,像read()这种阻塞读取函数还有BufferedReader类种的 readLine()、DataInputStream种的readUTF()等。

解决方案:

Socket任意一端在调用完write()方法时调用shutdownOutput()方法关闭输出流,这样服务器端的inputStream上的read操作就会返回-1, 这里我们要注意下不能调用socket.getInputStream().close()。因为它会导致socket直接被关闭。 当然如果不需要继续在socket上进行读操作,也可以直接关闭socket。但是这个方法不能用于通信双方需要多次交互的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值