使用C#TCP套接字将Java TCP服务器连接到Ubuntu到Windows 7中

时间:2013-01-16 10:39:17

标签: c# java sockets ubuntu ubuntu-11.04

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

  

System.Net.Sockets.SocketException:无法建立连接,因为目标计算机主动拒绝它192.168.0.129:20000      在System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)      在System.Net.Sockets.Socket.Connect(EndPoint remoteEP)      在TestUbuntuSocket.Form1.button1_Click(Object sender,EventArgs 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(消息& 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(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

那么我错了什么?

3 个答案:

答案 0 :(得分:0)

不了解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地址可以连接)。

如果没有神奇的过程将ipv4请求传送到ubuntu机器内的ipv6或者更改你的代码只能侦听ipv4,你的Windows客户端将需要:

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

答案 1 :(得分:0)

使用telnet主机端口检查防火墙。
如果你得到连接拒绝/超时,就会出现网络问题或者服务器无法正常工作,如果你可以输入一个回车并且线路更改/服务器回答,那就很好了。
This link解释了在Windows上安装telnet的信息。

答案 2 :(得分:0)

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

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