【问题标题】:connecting python socket and java socket连接python socket和java socket
【发布时间】:2014-01-21 16:49:12
【问题描述】:

我一直在尝试在 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());
  }

然后代码挂了,Python服务器没有收到任何信息,我用print测试了。

在 Java 客户端中尝试先发送然后等待服务器响应是否有问题?

任何帮助将不胜感激。

【问题讨论】:

  • 您在服务器中没有收到任何内容?相反,您似乎只接受连接,如果条件为真,您将写入一些数据并直接关闭连接。如果条件不成立,那么您似乎根本没有关闭套接字,但您也没有收到任何东西。
  • 当 java 客户端发送“turn_on”时,我可以在 python 的控制台上打印它,因此它到达了。

标签: java python sockets


【解决方案1】:

好吧,我发现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 结束字符串

【讨论】:

    【解决方案2】:

    连接 Python 和 Java 套接字


    安装包jpysocket

    pip install 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(); 
      }
      }
      }
    

    【讨论】:

      【解决方案3】:

      如果您只想在套接字连接上发送单个命令,则在编写命令后关闭 OutputStream(使用 Socket.shutdownOutput())。套接字正在读取直到 EOF,并且在关闭套接字之前您不会收到 EOF。因此,您的代码永远不会继续。

      来源 - java socket InputStream hangs/blocks on both client and server

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2014-02-15
        相关资源
        最近更新 更多