java socket对应的是网络协议中的tcp,tcp的三次握手、四次挥手、11中状态什么的这里就不说了,不知道大家平常使用socket的时候如果不注意的情况下,会不会遇到各种异常报错。
例如:

java.net.SocketException:socket is closed
错误提示的出现场景:
自己主动关闭了socket,但是之后还从里面读写数据
Software caused connection abort: socket write error
错误提示的出现场景:
对方已经关闭socket,依旧向对方写数据
connection reset (by peer)
错误提示出现的场景:
一端socket被关闭,另一端仍然发送数据,发送的第一个数据包 connection reset by peer
一端socket退出,退出时为关闭连接,另一端读数据 connection reset

所以在使用socket时,需要约定好双方读写完成的条件,然后关闭输入输出流:

socket.shutdownInput();
socket.shutdownOutput();

即当一方写入完成后,调用shutdownOutput关闭输出流,这时候对方的read方法就会返回-1,这时候对方就知道你写完了,对方可以关闭输入流,然后等待对方写入完成调用shutdownOutput后己方再调用shutdownInput,双方就正常关闭了输入输出流,这时候socket就不会出现异常了。

下面是一个socket交互的例子:
server端

public class OioServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("socket = " + socket);
            new Thread(() -> {
                try {
                    InputStream in = socket.getInputStream();
                    OutputStream out = socket.getOutputStream();
                    out.write("hello! I get your message that is follow".getBytes(Charset.forName("UTF-8")));
                    byte[] buf = new byte[1024];
                    int len;
                    while ((len = in.read(buf)) != -1) {
                        System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
                        out.write(buf, 0, len);
                    out.write("\n end \n".getBytes(Charset.forName("UTF-8")));
                    out.flush();
                    socket.shutdownInput();
                    socket.shutdownOutput();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
            }).start();

client端

public class OioClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8080);
        InputStream in = socket.getInputStream();
        new Thread(() -> {
            BufferedInputStream bufferIn = new BufferedInputStream(in);
            byte[] buf = new byte[1024];
            try {
                int len;
                while ((len = bufferIn.read(buf)) != -1) {
                    System.out.print(new String(buf, 0, len, Charset.forName("UTF-8")));
            }catch (Exception e) {
                e.printStackTrace();
            try {
                socket.shutdownInput();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
        }).start();
        OutputStream out = socket.getOutputStream();
        int cout = 10;
        while (cout-- > 0) {
            out.write(("this time is " + System.currentTimeMillis() + "\n").getBytes("UTF-8"));
        socket.shutdownOutput();
                    java socket对应的是网络协议中的tcp,tcp的三次握手、四次挥手、11中状态什么的这里就不说了,不知道大家平常使用socket的时候如果不注意的情况下,会不会遇到各种异常报错。例如:java.net.SocketException:socket is closed错误提示的出现场景:自己主动关闭了socket,但是之后还从里面读写数据Software caused conn...
1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就...
				
先前的一篇博文(C语言socket编程实现TCP通信),在unix系统下,利用C语言socket编程简单实现了客户端服务端TCP通信。实际上,利用java.net包中的类可以更容易的进行socket通信。 但不管是使用java还是C语言进行socket编程,TCP通信本质上是一样的。都是服务端端绑定一个端口并对此端口进行监听,客户端根据IP和端口访问服务端,两者通过三次握手建立连接,然后就可以通...
SocketSocketServer创建出来的输入输出流如果关闭的话,那么socketSocketServer也会关闭 但是有showdownInput()和showdownOutput()方法来改变流的流向 注意,关闭之后,就不能再使用该流,只能使用另外一种流,也就是如果关闭了输入流,就只能使用输出流,反之亦然 可能有小伙伴会疑惑,如果想使用一个Socket和ServerSocket进行交替输入输出操作怎么办? socket编程是基于http的编程,一次请求就是一个socket,下一次请求就再创
socket编程过程中往往会遇到这样那样的问题,出现了这些问题,有的是由于并发访问量太大造成的,有些却是由于代码中编程不慎造成的。 比如说,最常见的错误就是程序中报打开的文件数过多这个错误。socket建立连接的时候是三次握手,这个大家都很清楚, 但是socket关闭连接的时候,需要进行四次挥手,但很多人对于这四次挥手的具体流程不清楚,吃了很多亏。
Java 中,如果您的 Socket 没有被正确关闭,可能会导致连接被断开。如果您不关闭 Socket,它可能会一直处于打开状态,因此可能会出现一些问题,如资源泄漏、连接过期或连接池满了等问题。 此外,如果您的代码在客户端和服务器端都没有关闭 Socket,那么它们可能会被保持在打开状态,这可能会导致资源浪费和性能问题。 为了避免这种情况,建议在使用 Socket 后始终关闭它,以确保正确释放资源并避免潜在的连接问题。可以使用以下代码关闭 Socket: ```java socket.close(); 这将关闭Socket 相关联的流并释放与之相关的资源。在使用 Socket 时,请确保始终在使用完毕后关闭它。