qq_41852306 2019-06-16 12:25 采纳率: 0%
浏览 2580

JAVA的Socket为什么会自动关闭。跪了,求解

问题描述: 这里有一个服务器和一个带图形界面客户端。当的用户账号密码正确时,客户端会向服务器提出连接请求,也就是new Sicket(..., ...);

可是为什么客户端这个Socket会在成功连接7秒左右自动关闭。
我判断客户端的Socket已经关闭的原因有两个。

1.客户端的socket不停调用s.sendUrgentData方法,但在运行7秒左右时会抛出异常。

2 服务器一直在等待客户端的消息,但是在运行7秒左右服务器却抛出connection reset异常,在抛异常之前客户端可以正常发送数据,异常之后不能再发送了,在百度上知道这是因为发送方(也就是客户端)的socket已经关闭,而接收方还在等待接受而抛出的异常。

相关代码: // 客户端代码

public class LoginFrame extends JFrame {

    private  Socket s ;

    if (log()) {  // log是连接数据库的函数,会返回boolean表示用户名密码对不对
            s = Client.requst(nameTF.getText()); // 为s赋值,将返回的Socket保存在s中, 类的静态方法requst
        } else {
            System.out.println("登陆失败");
        }

}

// 主函数

public static void main(String[] args) throws InterruptedException {

    LoginFrame f = new LoginFrame();
    Thread.sleep(2000);// 为了给输入用户名和密码时间
    while (true) {
        try {
            f.s.sendUrgentData(0xFF);
            System.out.println("发送成功");
        } catch (IOException e) {

            System.out.println("因发送心跳包出现异常" + e.getMessage());
            break
        }

    }
}

// 客户端的连接请求代码
public class Client {

public static Socket requst(String name) {
    Socket s = null;
    try {
        // 发出连接请求
        s = new Socket("127.0.0.1", 8888);
        PrintWriter writer = new PrintWriter(s.getOutputStream());
        // 告诉服务器是谁刚刚连接
        writer.write(name + "\n");
        writer.flush();
    } catch (UnknownHostException e) {
        System.out.println(e.getMessage());
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

相关截图
客户端异常

图片说明

服务器异常(提问时,异常变成这个,但之前都是Connection reset)

图片说明

请各位朋友帮忙了。 这次是JAVA课程设计,但老师并没有讲Socket,Socket的一些细节我也不清楚。所以拜托了帮我找找Bug。


各位我实在是充不起C币。 要是问题解决了, 你支付宝二维码或者微信发过来,
我给你6块行不行。 拜托了,帮帮我吧。

  • 写回答

1条回答

  • qq_41852306 2019-06-16 15:49
    关注

    终于找到答案了。
    我的服务器通过发送心跳包来判断客户端是否在线。
    但是客户端的Socket并没有设置s.setOOBInline(true);
    这就导致了,服务器发送几个心跳后,客户端不再接受并抛出异常。
    终于解决了。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器