2014-10-10 206 views
0

我試圖在java中的python和客戶端程序中實現一個簡單的服務器程序。通過套接字連接Python和Java

Python服務器運行良好。 Java客戶端編譯良好。但無法連接到Python服務器。

這是我server.py

import sys 
import socket 



HOST = "" 
PORT = 8888 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print("Socket created") 



try: 
    s.bind((HOST, PORT)) 
except Socket.error as msg: 
    print("Bind failed.") 
    print("Error code: "+str(msg[0])) 
    print("Message: "+str(msg[1])) 
    sys.exit() 
print("Socket bind complete") 



s.listen(10) 
print("Socket now listening") 



while 1: 
    conn, addr = s.accept() 
    print("Connected with: "+addr[0]) 
    print(str(addr[1])) 


s.close() 

這是我Client.java文件:

import java.net.Socket; 
import java.io.IOException; 



public class Client { 

    public static void main(String[] args) { 

     try { 

      Socket socket = new Socket("localhost", 8888); 
      System.out.println("Connected"); 
      socket.close(); 
      System.out.println("Socket closed"); 
     } catch(IOException exception) { 

      exception.printStackTrace(); 
     } 
    } 
} 

Python的服務器監聽到端口8888。但Java客戶端無法連接。

這是輸出當我運行Client

java Client 

和輸出:

java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at java.net.Socket.connect(Socket.java:538) 
    at java.net.Socket.<init>(Socket.java:434) 
    at java.net.Socket.<init>(Socket.java:211) 
    at Client.connect(Client.java:84) 
    at Client.<init>(Client.java:65) 
    at Client.main(Client.java:301) 
Error connecting to localhost at 5555 

爲什麼不能連接?當我寫一個等效的Java server program,它工作正常。

這是我的Java服務器:Server.java

import java.net.Socket; 
import java.net.ServerSocket; 
import java.net.InetAddress; 
import java.io.IOException; 



public class ChatServer { 

    public static void main(String[] args) { 

     try { 

      ServerSocket server = new ServerSocket(8888); 
      Socket socket = server.accept(); 
      InetAddress ip = socket.getInetAddress(); 

      System.out.println("Client connected: "+ip.getHostAddress()); 
      socket.close(); 
     } catch(IOException exception) { 

      exception.printStackTrace(); 
     } 
    } 
} 

所以我的問題是短暫的:
爲什麼連接Client.javaServer.java,但不Server.py

任何幫助,將不勝感激。謝謝。

+0

'連接被拒絕'表示Python服務器在客戶端期望的位置('localhost:8888')不可用。通過telnet連接到Python服務器(例如'telnet properHost 8888'),然後在Java客戶端中使用該主機。 – 2014-10-10 10:51:07

回答

0

好像你永遠不會乾淨地關閉你的Python代碼中的套接字,所以它仍然可能從之前的運行嘗試卡住?另外,你的python程序目前對收到的連接不做任何事情,只是不斷嘗試接受。

嘗試這樣:

while(1): 
    conn, addr = s.accept() 
    print("Connected with: "+addr[0]) 
    #Waits for any incoming data and echoes it back 
    while(1): 
     data = conn.recv(1024) 
     #break if not found to get to close statement which was never reached in old code 
     if not data: break 
     print("Received data:", data.decode()) 
     conn.sendall(data) 
    conn.close() 
+1

這與我的問題有什麼關係? – 2014-10-10 15:25:20

0

我使用完全相同的Python代碼和Java代碼您發佈,似乎做工精細,可能是壞了你的環境?你可以用以下步驟(假設你在Linux機器上運行您的程序比如我)診斷問題:

1.just運行的python服務器腳本

./server.py 

2.使用netcat來看看服務器是良好的連接

nc -zv localhost 8888 

如果一切順利的話,你可能會看到連接爲預期建立。 如果不工作,就使用netcat建立一個TCP服務器偵聽端口8888

nc -l -p 8888 

,並與你的java程序連接到它。

你也可以用netstat來區分服務器。py works fine

sudo netstat -ntlp | grep :8888 
+0

感謝您的回覆。 'nx -zv localhost 8888'工作正常。但是我的Java程序無法連接。我的另一個'Client.py'無法連接到'Server.py'。我的'Client.java'可以連接到'Server.java'。但'Server.py'無法連接到'Client.java'。 – 2014-10-10 15:24:19

+0

這很奇怪,你應該改變一個端口,然後重試。並從java客戶端的異常堆棧中記錄,您可能連接到錯誤的端口** 5555 **而不是** 8888 **,這是您的python服務器建立的。順便說一下,'sudo netstat -ntlp | grep:8888'說? – armnotstrong 2014-10-11 02:25:22

+0

不,它仍然無法正常工作。我以爲如果之前這樣做。但失敗了 – 2014-10-14 16:09:05

0

我想我可以解決你的問題,但我不知道爲什麼。 你可以通過防火牆的配置將商品與

-A INPUT -i lo -j ACCEPT 

再試試,重新啓動iptables服務。