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)里加一个判断:
以此来判断是不是传输图片的最后一个数组。然后问题就解决啦。
新学菜鸟,如有问题欢迎指正,谢谢观看哈!!