1

我在 vmware 中运行了 Ubuntu 11.10。我在 Ubuntu 中运行 Java tcp 服务器。因此,当我将此服务器与来自 Ubuntu 的客户端连接时,它工作正常。但是当我试图从另一个操作系统(Windows 7)连接这个服务器时,它显示连接错误。我尝试连接 java 和 C# 客户端,但两次都显示连接错误。这是错误消息:

System.Net.Sockets.SocketException:无法建立连接,因为目标机器在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 处主动拒绝了它 192.168.0.129:20000 在 System.Net.Sockets.Socket .Connect(EndPoint remoteEP) at TestUbuntuSocket.Form1.button1_Click(Object sender, EventArgs e) at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System。 Windows.Forms.Button.OnMouseUp(MouseEventArgs meevent) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows。在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows 的 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 本地地址 外部地址 状态 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 :::* LISTEN 2168/java
tcp6 0 0 :::22 :::* LISTEN 408/sshd
tcp6 0 0 ::1:631 :::* LISTEN 925/cupsd
tcp6 0 0 :::20000 :::* LISTEN 3015/java
tcp6 0 0 127.0.0.1:20000 127.0.0.1:56269 CLOSE_WAIT 3015/java

那么我错了吗?

4

3 回答 3

0

服务器端是否有任何错误?您的服务器一次只接受一个请求,通常您会将接受的套接字传递给另一个线程来处理它,而不会阻塞服务器。我不确定 Dialog 是如何阻止服务器线程的,你看到服务器端有什么反应吗?

您可以尝试的另一件事是设置不同的端口,例如 8080,这通常不应该被阻止。

于 2013-01-16T13:33:02.323 回答
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 进程。

如果没有一个神奇的过程来将 ipv4 请求隧道传输到 ubuntu 机器内的 ipv6 或更改您的代码以仅监听 ipv4/以及,您的 Windows 客户端将需要:

  • 启用 ipv6
  • 使用 ubuntu 机器的 ipv6 地址连接

您应该能够使用系统菜单或运行“ifconfig”找到 ipv6 地址。它比 ipv4 地址更难输入,但您应该能够从 Windows 7 ping 该地址并连接到您的服务器。

于 2013-01-16T10:47:55.177 回答