错误代码展示
public class SocketTCP1Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
//一边读取文件一边将文件写入数据通道
FileInputStream fileInputStream = new FileInputStream("e:/flower.jpg");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
OutputStream outputStream = socket.getOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
byte[] bytes = new byte[1024];
int readlean = 0;
while((readlean = bufferedInputStream.read(bytes)) != -1){
bufferedOutputStream.write(bytes,0,readlean);
}
// bufferedOutputStream.flush(); 如果不在socket.shutdownOutput();这句代码前先进行close()或flush()的话就会出现SocketException: Cannot send after socket shutdown: socket write error错误
//设置结束标记
socket.shutdownOutput(); //结束标记,告诉服务端我写入的数据已经结束了
//读取服务端传来的“收到图片”
InputStream inputStream = socket.getInputStream();
byte[] bytes1 = new byte[1000];
int readlen2 = 0;
while ((readlen2 = inputStream.read(bytes1)) != -1){
System.out.println(new String(bytes1,0,readlen2));
}
//关闭流对象和socket
bufferedInputStream.close();
bufferedOutputStream.close();
inputStream.close();
socket.close();
}
}
错误原因说明:在writer()数据后直接加结束标记没有先进行close()或flush()
纠正:在socket.shutdownOutput前加close()或flush(),因为在写入数据时,writer()会先将数据写入缓冲区,待缓冲区满,调用flush()方法刷新流或调用close()方法关闭流时才真正输出。这样处理可以减少实际的写出次数,提高系统效率。如果需要写出的内容立即输出,需要在完成write()方法后调用flush()方法刷新流,否则程序可能不能正常工作。
借鉴参考于:Java中write()系列方法