簡體   English   中英

通過套接字連接Python和Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM