3

ゲームのログインデータベースに接続してチャットサーバーに接続するアプリケーションを作成しようとしていますが、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)
4

2 に答える 2

1

これらのメソッドはいずれも null を返すことはなく、そうでないことを示唆する証拠はどこにもありません。ここで null になるのは、例外のローカライズされたメッセージと、自分で null に設定したため、または最初は null でまったく設定されなかったために m_input だけです。簡単な方法でスタック トレースを出力してみてください。そうすると、new ObjectInputStream() によって例外がスローされていることがわかります。これはすべて明らかですが、例外の扱いが悪いために偽装されています。

その間、メソッドの名前を変更してください。Bind はソケット プログラミングですでに意味を持っていますが、これはそうではありません。

于 2012-11-24T18:48:17.453 に答える
-1

私はこれを以前に扱ったことがあり、ObjectInputStreams が正しく動作しないことがあります。私の場合、サーバー接続で最初に ObjectOutputStream を作成する必要があることがわかりました。そうしないと、そのように null が返されます。サーバーコードは独自のものですか? その場合は、クライアントで ObjectInputStream を作成する前に、まず ObjectOutputStream を作成してください。

これは、あなたの質問に似た、私がしばらく前に抱えていた問題を説明するのに役立つリンクです。これは、作成されるストリームの順序またはシーケンスに関係しています。

オブジェクト出力ストリーム プログラミング

于 2012-11-24T04:08:29.913 に答える