2014-10-10 208 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服务。