我让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
那么我错了什么?
答案 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,这通常不应该被阻止。