[英]Connecting Python and Java via sockets
我試圖在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.java
連接到Server.java
而不連接到Server.py
?
任何幫助,將不勝感激。 謝謝。
似乎您從不干凈地關閉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()
我使用的是您發布的確切的Python代碼和Java代碼,看來工作正常,您的環境可能有問題嗎? 您可以按照以下步驟診斷問題(假設您在像我這樣的linux系統中運行程序):
1.只需運行python服務器腳本
./server.py
2.使用netcat查看服務器是否適合連接
nc -zv localhost 8888
如果一切順利,您可能會看到連接已按預期建立。 如果不起作用,請使用netcat來構建TCP服務器,偵聽端口8888
nc -l -p 8888
並使用Java程序連接到它。
您還可以使用netstat
來區分server.py是否工作正常
sudo netstat -ntlp | grep :8888
我想我可以解決您的問題,但我不知道為什么。 您可以嘗試通過在防火牆配置上添加一個項目
-A INPUT -i lo -j ACCEPT
然后,重新啟動您的iptables服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.