【问题标题】:ObjectInputStream Blocking socket external ip madnessObjectInputStream 阻塞套接字外部 ip 疯狂
【发布时间】:2013-05-13 20:36:33
【问题描述】:

当我初始化我的 objectinputstreams,在我被 objectoutputstreams 初始化和刷新之后,我得到这个:

客户:

java.net.SocketTimeoutException: 读取超时 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(未知来源) 在 java.net.SocketInputStream.read(未知来源) 在 java.io.ObjectInputStream$PeekInputStream.read(未知来源) 在 java.io.ObjectInputStream$PeekInputStream.readFully(未知来源) 在 java.io.ObjectInputStream$BlockDataInputStream.readShort(未知来源) 在 java.io.ObjectInputStream.readStreamHeader(未知来源) 在 java.io.ObjectInputStream.(未知来源) 在 Start.refreshChangeLog(Start.java:87) 在 Start$2.windowOpened(Start.java:234) 在 java.awt.AWTEventMulticaster.windowOpened(未知来源) 在 java.awt.Window.processWindowEvent(未知来源) 在 javax.swing.JFrame.processWindowEvent(未知来源) 在 java.awt.Window.processEvent(未知来源) 在 java.awt.Component.dispatchEventImpl(未知来源) 在 java.awt.Container.dispatchEventImpl(未知来源) 在 java.awt.Window.dispatchEventImpl(未知来源) 在 java.awt.Component.dispatchEvent(未知来源) 在 java.awt.EventQueue.dispatchEventImpl(未知来源) 在 java.awt.EventQueue.access$200(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.awt.EventQueue$3.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.awt.EventQueue$4.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源)

服务器:

java.net.SocketException:连接重置 在 java.net.SocketInputStream.read(未知来源) 在 java.net.SocketInputStream.read(未知来源) 在 java.io.ObjectInputStream$PeekInputStream.read(未知来源) 在 java.io.ObjectInputStream$PeekInputStream.readFully(未知来源) 在 java.io.ObjectInputStream$BlockDataInputStream.readShort(未知来源) 在 java.io.ObjectInputStream.readStreamHeader(未知来源) 在 java.io.ObjectInputStream.(未知来源) 在客户端。(Client.java:27) 在 ThreadAccept.run(ThreadAccept.java:23)

还有我的客户代码:

public void refreshChangeLog() {
    Socket logSocket = null;
    ObjectInputStream input = null;
    ObjectOutputStream output = null;
    try {
        logSocket = new Socket(InetAddress.getByName(server), 21992);
        logSocket.setSoTimeout(0);
        output = new ObjectOutputStream(logSocket.getOutputStream());
        output.flush();
        input = new ObjectInputStream(logSocket.getInputStream());
        output.writeObject("type:changeLog");
        output.flush();
        Object o = input.readObject();
        while (o instanceof String && !((String) o).equals("done")) {
            String msg = (String) o;
            int index = msg.indexOf("|");
            if (index > -1) {
                changeLogMap.put(msg.substring(0, index), msg.substring(index + 1));
                changeLogList.addItem(msg.substring(0, index));
            }
            o = input.readObject();
        }
    }catch (Exception e) {
        e.printStackTrace();
        loadLocalChangeLog();
    }
    if (changeLogList.getItemCount() > 0) {
        changeLogList.setSelectedIndex(0);
        File changelog = new File(path + "changelog");
        if (!changelog.exists() || !changelog.isDirectory()) {
            changelog.mkdirs();
        }
        for (String key : changeLogMap.keySet()) {
            File changef = new File(changelog, key + ".txt");
            if (!changef.exists()) {
                try {
                    changef.createNewFile();
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (changef.exists()) {
                PrintWriter writer;
                try {
                    writer = new PrintWriter(changef);
                    writer.write(changeLogMap.get(key));
                }catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    try {
        if (output != null) {
            output.close();
            output = null;
        }
        if (input != null) {
            input.close();
            input = null;
        }
        if (logSocket != null) {
            logSocket.close();
            logSocket = null;
        }
    }catch (IOException e1) {
        e1.printStackTrace();
    }
}`

还有我的服务器代码:

socket = new ServerSocket(21992);
        new Client.ThreadUpdateLobby();
        while (Start.frame != null && socket != null && !socket.isClosed()) {
            Socket clientSocket = socket.accept();
            clientSocket.setSoTimeout(0);
            Client client = new Client(clientSocket);
            if (client.isValid) {
                synchronized (clients) {
                    clients.add(client);
                }
            }
            Thread.sleep(50L);
        }`

更多服务器代码:

this.socket = socket;
    try {
        this.socket = socket;
        output = new ObjectOutputStream(socket.getOutputStream());
        output.flush();
        input = new ObjectInputStream(socket.getInputStream());
        listener = new ThreadListen(this, input);
        isValid = true;
    }catch (Exception e) {
        e.printStackTrace();
        try {
            if (output != null) {
                output.close();
                output = null;
            }
            if (input != null) {
                input.close();
                input = null;
            }
            if (socket != null) {
                socket.close();
                this.socket = null;
            }
        }catch (IOException e1) {
            e1.printStackTrace();
        }
        isValid = false;
    }`

我一直很茫然,显然标题没有刷新?因此输入流只是坐着等待。问题似乎出在客户端。另外,只有当我使用我的外部网络 ip(98.232.202.119) 时才会出现这种情况,但如果我使用“127.0.0.1”或“192.168.2.50”没有问题我的端口被转发,我在线测试了它们。

【问题讨论】:

  • 在您的代码离可读性太远之后,您希望如何获得一些答案? :)
  • 它以某种方式自行修复。
  • 回滚。最好在网站上显示代码。要使代码格式正常工作,您只需将代码块与其他文本用空行分隔,就像分隔文本段落一样。
  • 这是给出错误的代码版本吗?服务器和客户端都首先创建 ObjectOutputStream,这意味着双方都不会等待读取对象流标头。
  • setSoTimeout(0) 只是重新声明默认值,即无限超时。你有一个读取超时,这在这段代码中是不可能的。因此,这不是您的真实代码。不是一个真正的问题。

标签: java sockets connection timeout objectinputstream


【解决方案1】:

我知道这个问题已经死了,但是为了谷歌的缘故,要解决这个问题,请检查客户端的外部 ip 是否与服务器的 ip 匹配,如果匹配,请使用本地地址。是什么原因造成的?是你的路由器。在某些型号中,WAN 安全性可防止本地计算机像远程计算机一样运行。我认为这没有安全问题,但显然,路由器公司会这样做。我试图打电话给我的公司并禁用我的 wan 安全性,以发现这是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多