【问题标题】:Why does my sockets getInputStream return null?为什么我的套接字 getInputStream 返回 null?
【发布时间】:2012-11-25 02:48:17
【问题描述】:

好吧,我正在尝试创建一个应用程序,该应用程序将连接到游戏的登录数据库并连接到聊天服务器,但是每当我尝试使用 Socket.getInputStream( ) 函数时,它都会抛出异常并且没有给我任何信息...我不确定它为什么会这样,所以我想知道你们是否可以提供帮助..

我是这样连接的:

public boolean Connect( String RemoteHostIP, int RemotePort )
{
    try
    {
        if( m_Socket != null )
        {
            m_Socket.close( );
            m_Socket        = null;
        }

        m_Socket            = new Socket( );
        m_Host              = RemoteHostIP;
        m_Port              = RemotePort;

        m_Socket.connect( new InetSocketAddress( m_Host, m_Port ) );

        System.out.println( "   ~ Connected to: " + m_Socket.getInetAddress( ).getHostAddress( ) + ":" + m_Socket.getPort( ) );
    }
    catch( SocketException Ex )
    {
        m_Socket            = null;
        System.err.println( "[SocketHelper::Connect SEN] " + Ex.getLocalizedMessage( ) );
        return false;
    }
    catch( IOException Ex )
    {
        m_Socket            = null;
        System.err.println( "[SocketHelper::Connect IOE] " + Ex.getLocalizedMessage( ) );
        return false;
    }

    return true;
}

然后像这样绑定到我的输入和输出:

public boolean Bind( )
{
    try
    {
        if( !m_Socket.isConnected( ) || m_Socket.isClosed( ) || !m_Socket.isBound( ) )
            return false;

        if( m_Socket.getOutputStream( ) != null )
        {
            m_Output            = new ObjectOutputStream( m_Socket.getOutputStream( ) );
            m_Output.flush( );
        }
        if( m_Socket.getInputStream( ) != null )
        {
            m_Input             = new ObjectInputStream( m_Socket.getInputStream( ) );
        }
    }
    catch( SocketException Ex )
    {
        System.err.println( "[SocketHelper::Bind SEN] " + Ex.getLocalizedMessage( ) + " (" + m_Output + " | " + m_Input + ")" );
        return false;
    }
    catch( IOException Ex )
    {
        System.err.println( "[SocketHelper::Bind IOE] " + Ex.getLocalizedMessage( ) + " (" + m_Output + " | " + m_Input + ")" );
        return false;
    }

    return true;
}

这是我的输出

    ~ Connected to: 96.127.149.202:11031
Failed to Connect: Could not bind to socket
[SocketHelper::Bind IOE] null (java.io.ObjectOutputStream@1202f4d | null)

【问题讨论】:

  • 你的 2. 错误信息来自哪里?

标签: java sockets


【解决方案1】:

这些方法都不会在任何时候返回 null,并且这里没有任何证据表明其他情况。这里唯一为 null 的是异常的本地化消息和 m_input,因为您自己将其设置为 null,或者因为它最初为 null 并且根本没有设置。尝试以简单的方式执行此操作并打印堆栈跟踪。当你这样做时,你会发现异常是由 new ObjectInputStream() 抛出的。这一切都是显而易见的,但它被你对异常的糟糕处理所掩盖。

当您使用它时,请重命名您的方法。 Bind 在 socket 编程中已经有了意义,不是这样的。

【讨论】:

    【解决方案2】:

    我之前已经处理过这个问题,但 ObjectInputStreams 有时无法正常运行。在我的情况下,我发现服务器连接需要首先创建一个 ObjectOutputStream 否则它将像它一样返回 null 。服务器代码是您自己的,如果是,请确保在尝试在客户端创建 ObjectInputStream 之前先创建 ObjectOutputStream。

    这是一个链接,可以帮助描述我不久前遇到的问题,该问题与您的问题类似。它与正在创建的流的顺序或顺序有关。

    Object outputstream programmig

    【讨论】:

    • 这会导致死锁。它不会也不会导致 getInputStream() 或 getOutputStream() 返回 null。
    • 好的,服务器在你的控制之下吗?如果是这样,请尝试创建一个字符串或字节输出/输入流,看看它是否仍然返回 null。
    • “返回null”,相反的证据为零。
    • 不,服务器不在我的控制范围内。 EJP,我不确定我在哪里将 m_Input 设置为 null?我检查 if( m_Socket.getInputStream( ) != null ) 然后我将 m_Input 设置为不为 null 的 m_Socket.getInputStream( ) ... 很可能发生的是 getInputStream 抛出异常并回答不,错误消息来自我调用 Bind 函数的位置。它只是检查 Bind 函数是否返回 true 或 false,如果 false 显示,“无法连接:无法绑定到套接字”
    • at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279) at Helper.SocketHelper.Bind(SocketHelper.java:95) at HoN.Modules.CBot.Connect(CBot.java:137) at Main.CMain.main(CMain.java:17)
    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2022-01-10
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多