2013-01-16 80 views
1

我將Ubuntu 11.10運行到vmware中。我正在運行一個Java tcp服務器到Ubuntu。所以當我連接這臺服務器與Ubuntu的客戶端時,它的工作正常。但是,當我嘗試從另一個操作系統(Windows 7)連接到此服務器時,顯示連接錯誤。我試圖連接java和C#客戶端,但兩次都顯示連接錯誤。以下是錯誤消息:將Java TCP服務器與C#TCP套接字連接到Windows 7中

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的) 在System.Windows.Forms.Control.OnClick(EventArgs的) 在System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(M essage &米,MouseButtons按鈕,點擊的Int32) 在System.Windows.Forms.Control.WndProc(消息&米) 在System.Windows.Forms.ButtonBase.WndProc(消息&米) 在System.Windows.Forms的。 Button.WndProc(消息&米) 在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&米) 在System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&米) 在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); 
     } 

這是「須藤的輸出netstat -atnp':

Proto Recv- Q發送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

您能否用文本中的完整錯誤信息替換屏幕截圖? – fge

+0

@fge沒關係,只是。 – Barun

+0

防火牆設置?我猜這個端口是關閉的,非本地訪問。 – Fildor

回答

0

不知道多少java,但通常必須在服務器上調用監聽/接受類型方法,如果沒有這些方法,服務器將不會偵聽傳入連接。

如果您使用telnet在服務器上的本地連接在相同的IP /端口上,並且失敗,則會指向相同的診斷。如果telnet可能會導致防火牆/網絡設置問題。

[編輯]

我認爲你的問題可能是你的Ubuntu框設置爲IPv6和Java代碼只監聽IPv6的。

查看關於ipv6 here的文檔。

檢查您的netstat的輸出,你的java代碼是這裏的特色:

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

這意味着你有一個java程序偵聽IPv6組播(任何IPv6地址可以連接)使用端口20000

沒有一個神奇的過程,以隧道的IPv4請求到Ubuntu的機器內部IPv6或更改代碼的IPv4只聽/還有,你的windows客戶端將需要:

你應該能夠找到使用系統菜單或運行「使用ifconfig」 IPv6地址。輸入IPV4地址會比較困難,但您應該能夠從Windows 7 ping通地址以及連接到您的服務器。

+0

說實話我沒有太多關於linux的知識。我應該怎麼做,以便Ubuntu接受客戶端連接? – Barun

+0

你應該什麼都不做。 ubuntu不會阻止任何連接作爲默認 – fredcrs

+0

你沒有說如果你可以通過本地連接到你的服務器本地或不是。也許試試'sudo netstat -atnp'來驗證你的服務器正在監聽正確的接口和端口。 –

0

用telnet主機端口檢查防火牆。
如果您的連接被拒絕/超時,則可能是網絡問題或服務器無法正常工作,如果您可以輸入回車符並且換行/服務器回答,則情況良好。
This link解釋了在Windows上安裝telnet。

0

服務器端是否有錯誤? 您的服務器一次只接受一個請求,通常您會將接受的套接字傳遞給另一個線程來處理它,而不會阻塞服務器。 我不確定Dialog是如何阻塞服務器線程的,你是否看到服務器端有任何反應?

你可以嘗試的另一件事是設置一個不同的端口,如8080這通常不應該被阻止。

+0

不,沒有在服務器端的反應..不要忘記它在同一個Ubuntu服務器上的客戶端工作..我試過8080,它不工作。 – Barun

+0

我通常不使用Windows,但我不時使用它進行測試。有一件事我發現Windows防火牆想阻止Java並請求權限。我不知道這是否適用於你的Windows版本,但也許你可以檢查? – JavaJens