记录一个io流引起的tcp连续传输阻塞问题

tcp客户端通过字节数组传输一个图片到服务端,服务端数组接收并写到本地文件;

重点是Client继续发送数据流到Server端。然后产生了问题:

客户端代码:

public class Client {
    public static void main(String[] args) throws Exception, IOException {
        System.out.println("---------------------client-------------------");
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.jpg"));

        byte[] b = new byte[1024];
        int len = 0;
        while ((len = bis.read(b)) != -1) {
            bos.write(b, 0, len);
        }
        bos.flush();
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("发给你了!!");
        dos.flush();
        bis.close();
        socket.close();

    }
}

服务端代码:

public class Server {
	public static void main(String[] args) throws Exception {
		System.out.println("----------------------Server------------------");
		ServerSocket server = new ServerSocket(8888);
		Socket socket = server.accept();
		BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
		BufferedOutputStream bos = new BufferedOutputStream(new         
        FileOutputStream("D:\\b.jpg"));
		byte[] b = new byte[1024];
		int len = 0;
		while((len=bis.read(b)) !=-1){
			bos.write(b, 0, len);
		}
		bos.flush();
		DataInputStream dis = new DataInputStream(socket.getInputStream());
		String mess = dis.readUTF();
		System.out.println(mess);

		bos.close();
		server.close();
	}
}

运行结果:                简单的tcp传输,不就是连续传了两个吗,代码很简单,怎么会出问题???

 遇到问题当然是问度娘,查谷歌了。但是,,,,问题能查到好多和我一样的,解决方法没有查到!!!这么衰的么?但是内心坚信不能随随便便放弃,毕竟这只是Javase的东西,还能搞不定吗。

重点来了哈!!!

最后将问题锁定在了这里。

先看一下API中read方法的解释:

这是个阻塞方法,在流可用之前,方法一直阻塞。因为客户端是通过一个个数组来传递数据,服务端一直等着接收数组,然后才可以写到本地上,所以当流建立的时候,read方法就一直阻塞来接收一个个数组。当客户端发送完,流没有断,read还在一直阻塞着等着下一个数组,等不到也死不回头。所以出现了图片传完,不能继续传输的问题。

解决办法:

方法就就是想办法让read停下来。读完图片就停止阻塞,然后让程序该干啥干啥。然后想到,图片传完,最后一个数组和前面数组的区别不就是最后的数组不会满吗?所以在where(read)里加一个判断:

以此来判断是不是传输图片的最后一个数组。然后问题就解决啦。

新学菜鸟,如有问题欢迎指正,谢谢观看哈!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值