
错误代码展示
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()系列方法
本文探讨了Java Socket编程中遇到的问题,即在发送文件后设置结束标记时,若不先关闭或刷新缓冲流,可能会导致`SocketException: Cannot send after socket shutdown`错误。解决方案是在调用`shutdownOutput()`前确保使用`close()`或`flush()`将缓冲区内容实际写出。此外,还强调了`write()`方法如何使用缓冲区提高效率,以及在需要立即输出时使用`flush()`的重要性。

4630

被折叠的 条评论
为什么被折叠?



