Java Socket 多次交互问题

Java Socket 多次交互问题

前几天学了网络编程 我在复现的过程中遇到了不少问题

问题出现

问题就是 关闭传输流 导致 Socket关闭从而导致报错

服务端代码

import javax.print.attribute.standard.RequestingUserName;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.TreeSet;

public class Service {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
            ServerSocket server = new ServerSocket(55535);
            System.out.println("服务器启动完毕");

          //第一次
            Socket socket = server.accept();

            OutputStream out = socket.getOutputStream();
            InputStream in = socket.getInputStream();
            PrintStream ps = new PrintStream(out);
            ps.println(Thread.currentThread().getName()+"欢迎你连接服务器");
            //socket.getOutputStream().flush();
            ObjectInputStream obj = new ObjectInputStream(in);
            System.out.println(obj.readObject());
            System.out.println("第一次");
        
		// 第二次
            OutputStream out1 = socket.getOutputStream();
            InputStream in1 = socket.getInputStream();
            PrintStream ps1 = new PrintStream(out1);
            ps1.println(Thread.currentThread().getName()+"欢迎你连接服务器");
           // socket.getOutputStream().flush();
            ObjectInputStream obj1 = new ObjectInputStream(in1);
            System.out.println(obj1.readObject());
            System.out.println("第一次");

        socket.close();
       // }
       // }

    }
}

客户端代码

import java.io.*;
import java.net.Socket;
import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Client {
    public static void main(String[] args) throws IOException {
        	Socket socket = new Socket("localhost",55535);
        //第一次
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            InputStreamReader inputStreamReader =new InputStreamReader(in);
            BufferedReader reader = new BufferedReader(inputStreamReader);
            System.out.println(reader.readLine());

            HashMap<String,Integer> hashMap =new HashMap<>();
            hashMap.put("user",1);
            ObjectOutputStream obj = new ObjectOutputStream(out);
            obj.writeObject(hashMap);

            obj.close();
            System.out.println(socket.isClosed());
            //socket.getOutputStream().flush();
    	//第二次
            InputStream in1 = socket.getInputStream();
            OutputStream out1 =socket.getOutputStream();
            InputStreamReader inputStreamReader1 =new InputStreamReader(in1);
            BufferedReader reader1 = new BufferedReader(inputStreamReader1);
            System.out.println(reader1.readLine());
     

            ObjectOutputStream obj1 = new ObjectOutputStream(out1);
            obj1.writeObject(hashMap);
        //obj1.close();
        //socket.getOutputStream().flush();
    }
}

一开始我写代码的时候客户端和服务端只有一次交互 运行起来也没有任何问题 然后我又把服务端和客户端的第二次交互写了出来 理论上没有任何问题 但是却报错了

客户端报错

在这里插入图片描述

这里说我 socket关闭了,奇怪我又没关它啊

客户端socket一关 服务端那边也报错 然后程序就崩溃了

后来我发现了关键代码

在这里插入图片描述
正是这一行代码带来的问题

问题分析

正常情况下 输入流开关 完全影响不到 socket 开关 但是我们这里obj流 最终还是来自 socket
在这里插入图片描述

这里一调用 obj.close() 然后流自底向上 层层关闭 最终引起 socket 的关闭

我在obj.close() 加了一条测试语句 我们可以在运行结果中得到证实

在这里插入图片描述

在这里插入图片描述

可以看到 控制台输出了true 说明socket 真的关闭了

解决办法

不要轻易关闭从socket得到的流

可以在程序最后 直接调用

socket.shutdownOutput();  // 这两个 关一个另一个也跟着关
socket.shutdownInput();
socket.close();          //最后关闭socket
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值