【问题标题】:Connecting with Java TCP server into Ubuntu with C# TCP socket into Windows 7使用 C# TCP 套接字将 Java TCP 服务器连接到 Ubuntu 到 Windows 7
【发布时间】:2013-01-16 10:39:17
【问题描述】:

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

System.Net.Sockets.SocketException:无法建立连接,因为目标机器主动拒绝它 192.168.0.129:20000 在 System.Net.Sockets.Socket.DoConnect(端点 endPointSnapshot,SocketAddress socketAddress) 在 System.Net.Sockets.Socket.Connect(端点 remoteEP) 在 TestUbuntuSocket.Form1.button1_Click(对象发送者,EventArgs e) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(消息和 m,MouseButtons 按钮,Int32 点击) 在 System.Windows.Forms.Control.WndProc(消息和 m) 在 System.Windows.Forms.ButtonBase.WndProc(消息和 m) 在 System.Windows.Forms.Button.WndProc(消息和 m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

这是我的 C# 客户端 Socket 代码:

        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 :::* 听 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

那我错了吗?

【问题讨论】:

  • 您能否将屏幕截图替换为文本中的完整错误消息?
  • 防火墙设置?我猜该端口已关闭以供非本地访问。
  • Java 代码有什么异常?
  • @Fildor 我在运行应用程序之前打开了端口。我的命令是:sudo ufw allow 20000
  • @Eng.Fouad java.net.ConnectException:连接被拒绝:连接

标签: c# java sockets ubuntu ubuntu-11.04


【解决方案1】:

使用 telnet 主机端口检查防火墙。
如果你得到连接被拒绝/超时,要么是网络问题,要么是服务器不工作,如果你可以输入回车并且换行/服务器回答,一切都很好。
This link解释安装Windows 上的 telnet。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,服务器端没有任何反应..不要忘记它在同一个 ubuntu 服务器上为客户端工作..我也试过 8080,但它也不能正常工作。
    • 我平时不使用windows,但有时我不得不使用它进行测试。我发现 Windows 防火墙想要阻止 java 并请求权限的一件事。我不知道这是否适用于您的 Windows 版本,但也许您可以检查一下?
    【解决方案3】:

    不太了解java,但通常必须在服务器上调用listen/accept 类型的方法,没有这些,服务器将不会监听传入的连接。

    如果您使用 telnet 在同一 ip/端口上本地连接服务器并且失败,这将指向相同的诊断。如果 telnet 成功,则可能是防火墙/网络设置问题。

    [编辑]

    我认为你的问题可能是你的 ubuntu 机器是为 ipv6 设置的,而你的 java 代码只在 ipv6 上监听。

    检查 ipv6 here 上的文档。

    检查您的 netstat 的输出,您的 java 代码在此处显示:

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

    这意味着您有一个 java 进程使用端口 20000 监听 ipv6 多播(任何 ipv6 地址都可以连接)。

    如果没有在 ubuntu 机器内将 ipv4 请求隧道传输到 ipv6 或更改代码以仅侦听 ipv4/以及,您的 Windows 客户端将需要:

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

    【讨论】:

    • 老实说我对linux的了解不多。我应该怎么做才能让 ubuntu 接受客户端连接?
    • 你什么都不应该做。 ubuntu 默认不阻止任何连接
    • 您没有说是否可以通过本地 telnet 连接到您的服务器。也许尝试“sudo netstat -atnp”来验证您的服务器正在侦听正确的接口和端口。
    • @PeterWishart 请检查我更新的帖子以获取“sudo netstat -atnp”的输出。输出有什么问题吗?
    • 看起来不错。您的服务器可能仅在 ipv6 上侦听,请尝试通过其 ipv6 地址进行远程连接。看起来您可以在本地连接到服务器。抱歉,如果这没有帮助,我不使用 ubuntu。
    猜你喜欢
    • 2016-05-01
    • 2015-10-04
    • 1970-01-01
    • 2020-09-09
    • 2014-07-02
    • 2012-06-13
    • 2020-09-17
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多