连接Python套接字和Java套接字

5

我已经尝试在Java客户端套接字和Python服务器套接字之间发送简单的字符串。以下是服务器套接字的代码:

HOST=''
PORT=12000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADRR,1)
s.bind((HOST,PORT))
s.listen(5)
device=variador()
while True:

  conn,addr=s.accept()
  if data=="turn_on":
     respuesta=device.send_order(variador.start_order)
     conn.send(respuesta+'\n')
     conn.close()

客户端代码如下:

   try {

            Socket socket = new Socket("192.168.10.171", 12000);

            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            BufferedReader in = new BufferedReader(new InputStreamReader(
                                       socket.getInputStream()));    

            BufferedReader stdIn = new BufferedReader(
                                          new InputStreamReader(System.in));

            out.print(command);

            out.close();
            in.close();
            socket.close();

        } catch (UnknownHostException e) {
            System.err.println("Unknown Host.");
           // System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for "
                               + "the connection.");
          //  System.exit(1);
        }

一切都很好,直到我尝试读取服务器的响应,使用以下内容:

    String userInput;
  while ((userInput = stdIn.readLine()) != null) {
  out.println(userInput);
  System.out.println("echo: " + in.readLine());
  }

如果在Java客户端尝试先发送请求,然后等待服务器响应,那么当代码挂起时,Python服务器将不会收到任何信息。我使用print进行了测试。

请问这是否存在问题?

非常感谢您的帮助!


你在服务器上没有收到任何东西吗?相反,你似乎只接受连接,如果条件成立就写入一些数据并直接关闭连接。如果条件不成立,则似乎根本不关闭套接字,但也没有收到任何东西。 - Some programmer dude
当Java客户端发送“turn_on”时,我可以在Python控制台上打印它,因此它已经到达。 - carlos palma
3个回答

9

我发现Java客户端会卡住,因为Python服务器发送的消息没有明确用\r\n结尾。所以Python代码应该像这样:

HOST = ''
PORT = 12000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADRR, 1)
s.bind((HOST, PORT))
s.listen(5)
device = variador()
while True:

    conn, addr = s.accept()
    if data == "turn_on\r\n":
        respuesta = device.send_order(variador.start_order)
        conn.send(respuesta + '\r\n')
    conn.close()

我知道从Java中的方法名,readline()println,两个方法名都暗示了Java使用\r\n序列来结束字符串。


1

连接Python和Java的套接字


安装包jpysocket

使用pip安装jpysocket

https://pypi.org/project/jpysocket

导入库 jpysocket

以下是一些示例:

Python服务器:

import jpysocket
import socket

host='localhost' #Host Name
port=12345    #Port Number
s=socket.socket() #Create Socket
s.bind((host,port)) #Bind Port And Host
s.listen(5) #Socket is Listening
print("Socket Is Listening....")
connection,address=s.accept() #Accept the Connection
print("Connected To ",address)
msgsend=jpysocket.jpyencode("Thank You For Connecting.") #Encript The Msg
connection.send(msgsend) #Send Msg
msgrecv=connection.recv(1024) #Recieve msg
msgrecv=jpysocket.jpydecode(msgrecv) #Decript msg
print("From Client: ",msgrecv)
s.close() #Close connection
print("Connection Closed.")

Java客户端:
import java.io.*;  
  import java.net.*; 
  public class Client {
  public static void main(String[] args) {  
  try{      
  Socket soc=new Socket("localhost",12345);  
  DataOutputStream dout=new DataOutputStream(soc.getOutputStream());  
  DataInputStream in = new DataInputStream(soc.getInputStream());
  String msg=(String)in.readUTF();
  System.out.println("Server: "+msg);
  dout.writeUTF("Ok Boss");
  dout.flush();
  dout.close();
  soc.close();
  }
  catch(Exception e)
  {
      e.printStackTrace(); 
  }}}  

Python客户端:
import jpysocket
import socket

host='localhost' #Host Name
port=12345    #Port Number
s=socket.socket() #Create Socket
s.connect((host,port)) #Connect to socket
print("Socket Is Connected....")
msgrecv=s.recv(1024) #Recieve msg
msgrecv=jpysocket.jpydecode(msgrecv) #Decript msg
print("From Server: ",msgrecv)
msgsend=jpysocket.jpyencode("Ok Boss.") #Encript The Msg
s.send(msgsend) #Send Msg
s.close() #Close connection
print("Connection Closed.")

Java服务器:
import java.io.*;  
import java.net.*; 
public class Server {
  public static void main(String[] args) {
      try{ 
      ServerSocket serverSocket = new ServerSocket(12345);
      Socket soc = serverSocket.accept();
      System.out.println("Receive new connection: " + soc.getInetAddress());
      DataOutputStream dout=new DataOutputStream(soc.getOutputStream());  
      DataInputStream in = new DataInputStream(soc.getInputStream());
      dout.writeUTF("Thank You For Connecting.");
      String msg=(String)in.readUTF();
      System.out.println("Client: "+msg);
      dout.flush();
      dout.close();
      soc.close();
      }
      catch(Exception e)
      {
      e.printStackTrace(); 
  }
  }
  }

0
如果您只想在套接字连接上发送单个命令,则在写入命令后关闭OutputStream(使用Socket.shutdownOutput())。套接字会一直读取,直到EOF,并且在关闭套接字之前您将不会收到EOF。因此,您的代码永远无法继续执行。
来源 - java socket InputStream hangs/blocks on both client and server 希望对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接