Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java TCP服务器连接到Ubuntu,并将C#TCP套接字连接到Windows 7_C#_Java_Sockets_Ubuntu_Ubuntu 11.04 - Fatal编程技术网

将Java TCP服务器连接到Ubuntu,并将C#TCP套接字连接到Windows 7

将Java TCP服务器连接到Ubuntu,并将C#TCP套接字连接到Windows 7,c#,java,sockets,ubuntu,ubuntu-11.04,C#,Java,Sockets,Ubuntu,Ubuntu 11.04,我已经将Ubuntu 11.10运行到vmware中。我正在Ubuntu中运行Java tcp服务器。因此,当我将此服务器与Ubuntu的客户端连接时,它工作正常。但是,当我试图从另一个操作系统(Windows 7)连接到此服务器时,显示连接错误。我试图连接java和C#客户端,但都显示连接错误。以下是错误消息: System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它192.168.0.129:20000 位于System.Net.Socke

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

System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它192.168.0.129:20000 位于System.Net.Sockets.Socket.DoConnect(端点端点快照,SocketAddress SocketAddress) 位于System.Net.Sockets.Socket.Connect(端点remoteEP) 在TestUbuntuSocket.Form1.button1\u单击(对象发送者,事件参数e) 在System.Windows.Forms.Control.OnClick(EventArgs e)中 在System.Windows.Forms.Button.OnClick(EventArgs e)中 在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.Forms.ButtonBase.WndProc(Message&m) 在System.Windows.Forms.Button.WndProc(Message&m)中 在System.Windows.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");
    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客户端套接字代码:

        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");
    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:22 0.0.0.0:*收听408/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:*收听925/cupsd
TCP60:1:42098::*听2168/java
tcp6 0:::22::*收听408/sshd
TCP60:1:631::*听925/cupsd
tcp6 0:::20000::*收听3015/java
tcp6 0 0 127.0.0.1:20000 127.0.0.1:56269关闭等待3015/java


那么我错了什么呢?

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

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

[编辑]

我想你的问题可能是你的ubuntu盒子是为ipv6设置的,而你的java代码只是在ipv6上监听

检查ipv6上的文档

通过检查netstat的输出,您的java代码的特点如下:

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

如果没有一个神奇的过程将ipv4请求隧道到ubuntu机器内的ipv6,或者将代码更改为只侦听ipv4/也不侦听ipv4,您的windows客户端将需要:

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

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

使用telnet主机端口检查防火墙。
如果您的连接被拒绝/超时,则可能是网络问题或服务器不工作,如果您可以输入回车并且线路更改/服务器应答,则一切正常。

解释在Windows上安装telnet。

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


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

您能用文本中的完整错误消息替换屏幕截图吗?防火墙设置?我猜该端口已关闭以进行非本地访问。Java代码中有什么异常?@Fildor我在运行应用程序之前打开了该端口。我的命令是:sudo ufw allow20000@Eng.Fouad连接异常:连接被拒绝:连接说实话,我对linux不太了解。我应该怎么做才能让ubuntu接受客户端连接?你什么都不应该做。ubuntu不会阻止任何连接,因为默认情况下,您没有说明是否可以通过telnet本地连接到服务器。也许可以尝试“sudo netstat-atnp”来验证您的服务器正在侦听正确的接口和端口。@彼得维沙特请查看我更新的帖子中的“sudo netstat-atnp”输出。输出有问题吗?看起来不错。您的服务器可能只侦听ipv6,请尝试通过其ipv6地址远程连接。看起来您可以在本地连接到服务器。抱歉,如果这没有帮助,我不使用ubuntu。不,服务器端没有任何反应。别忘了它在同一个ubuntu服务器上为客户端工作。另外,我尝试了8080,但它也不工作。我通常不使用windows,但有时我不得不使用它进行测试。我发现Windows防火墙想要阻止java并请求权限。我不知道这是否适用于你的windows版本,但也许你可以检查一下?