1

VMware で Ubuntu 11.10 を実行しています。Java tcp サーバーを Ubuntu で実行しています。したがって、このサーバーを Ubuntu のクライアントに接続すると、正常に動作します。しかし、別の OS (Windows 7) からこのサーバーに接続しようとすると、接続エラーが表示されます。Java と C# クライアントの両方に接続しようとしましたが、両方とも接続エラーが表示されます。エラーメッセージは次のとおりです。

System.Net.Sockets.SocketException: ターゲット マシンが System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) で System.Net.Sockets.Socket で 192.168.0.129:20000 をアクティブに拒否したため、接続できませんでした.Connect(EndPoint remoteEP) at TestUbuntuSocket.Form1.button1_Click(オブジェクト送信者、EventArgs e) System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System. Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) で System.Windows.Forms.Control.WmMouseUp(Message& m、MouseButtons ボタン、Int32 クリック) で System.Windows.Forms.Control.WndProc(Message& m) で System.Windows。 System.Windows の System.Windows.Forms.Button.WndProc(Message& m) の Forms.ButtonBase.WndProc(Message& m)。Forms.Control.ControlNativeWindow.OnMessage(Message& m) System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) で System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

これが私のC#クライアントソケットコードです:

        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        s.Connect(new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text)));
        if (s.Connected)
        {
            s.Send(Encoding.ASCII.GetBytes(textBox3.Text));
        }
        else
            MessageBox.Show("Not Connected");

そして、ここに私のJavaクライアントソケットコードがあります:

    Socket socket = null;
    try{
        socket = new Socket(txtIp.getText(), Integer.parseInt(txtPort.getText()));
    }
    catch(Exception exc){
        JOptionPane.showMessageDialog(this, "Server is not available!!");
        return;
    }
    try{
        PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
        out.println(txtMessage.getText());
        socket.close();
    }
    catch(Exception exc){
        JOptionPane.showMessageDialog(this, "Error when sending data!!");
    }

サーバー Java コード:

        ServerSocket s = new ServerSocket(port);

        while (start)
        {
            Socket incoming = s.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            String message = "";
            String line = in.readLine();
            while(line != null){
                 message += line;
                 line = in.readLine();
            }
            JOptionPane.showMessageDialog(null, message);
        }

これは「sudo netstat -atnp」の出力です:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/プログラム名 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 408/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 925/cupsd
tcp6 0 0 ::1:42098 :::* リッスン 2168/java
tcp6 0 0 :::22 :::* リッスン 408/sshd
tcp6 0 0 ::1:631 :::* リッスン 925/cupsd
tcp6 0 0 :::20000 :::* リッスン 3015/java
tcp6 0 0 127.0.0.1:20000 127.0.0.1:56269 CLOSE_WAIT 3015/java

だから私は間違っていますか?

4

3 に答える 3

0

telnet ホスト ポートでファイアウォールを確認します。
接続が拒否/タイムアウトになった場合は、ネットワークに問題があるか、サーバーが動作していないかのいずれかです。キャリッジ リターンを入力して行が変わり、サーバーが応答する場合は問題ありません。
このリンクでは、Windows での telnet のインストールについて説明しています。

于 2013-01-16T11:06:33.680 に答える
0

Java についてはよくわかりませんが、サーバーで listen/accept タイプのメソッドを呼び出さなければならないのが通常です。これらがないと、サーバーは着信接続をリッスンしません。

telnet を使用して同じ IP/ポート上のサーバーにローカル接続し、失敗した場合、これは同じ診断を示します。telnet が成功する場合は、おそらくファイアウォール/ネットワークのセットアップの問題です。

[編集]

あなたの問題は、ubuntu ボックスが ipv6 用に設定されていて、Java コードが ipv6 でのみリッスンしていることだと思います。

ここで ipv6 に関するドキュメントを確認してください。

netstat の出力を確認すると、Java コードがここに表示されます。

tcp6 0 0 :::20000 :::* LISTEN 3015/java

これは、ポート 20000 を使用して IPv6 マルチキャスト (任意の IPv6 アドレスが接続可能) をリッスンする Java プロセスがあることを意味します。

ubuntuマシン内でipv4リクエストをipv6にトンネリングする魔法のプロセスや、ipv4のみ/同様にリッスンするようにコードを変更することなく、Windowsクライアントは次のことを行う必要があります。

システム メニューを使用するか、「ifconfig」を実行すると、ipv6 アドレスを見つけることができるはずです。ipv4 アドレスよりも入力が難しくなりますが、Windows 7 からそのアドレスに ping を実行し、サーバーに接続できるはずです。

于 2013-01-16T10:47:55.177 に答える
0

サーバー側にエラーはありませんか?サーバーは一度に 1 つのリクエストのみを受け入れます。通常、サーバーをブロックすることなく、受け入れたソケットを別のスレッドに渡して処理します。ダイアログがサーバー スレッドをどのようにブロックするのか正確にはわかりませんが、サーバー側で何らかの反応が見られますか?

もう 1 つの方法として、8080 などの別のポートを設定することもできます。これは通常、ブロックされるべきではありません。

于 2013-01-16T13:33:02.323 に答える