【问题标题】:Communication between python client and java serverpython客户端和java服务器之间的通信
【发布时间】:2023-07-03 18:54:01
【问题描述】:

我的目标是将消息从 python 套接字发送到 java 套接字。我确实看过上面提到的资源。但是我正在努力让 Python 客户端与 Java 服务器通信。主要是因为python中的(行尾)与java中的不同。

假设我从 python 客户端写:消息 1:abcd 消息 2:efgh 消息 3:q(退出)

在 java 服务器:我收到消息 1:abcdefghq 后跟异常,因为 python 客户端已从其末端关闭套接字。

谁能为java和python之间的一致对话提出一个解决方案。

我使用的参考:http://www.prasannatech.net/2008/07/socket-programming-tutorial.html

更新:我忘了补充,我正在处理 TCP。

我的 JAVA 代码是这样的:(服务器套接字)

String fromclient;

ServerSocket Server = new ServerSocket (5000);

System.out.println ("TCPServer Waiting for client on port 5000");

while(true) 
{
    Socket connected = Server.accept();
    System.out.println( " THE CLIENT"+" "+ connected.getInetAddress() +":"+connected.getPort()+" IS CONNECTED ");

    BufferedReader inFromClient = new BufferedReader(new InputStreamReader (connected.getInputStream()));

    while ( true )
    {
        fromclient = inFromClient.readLine();

        if ( fromclient.equals("q") || fromclient.equals("Q") )
        {
            connected.close();
            break;
        }
        else
        {
            System.out.println( "RECIEVED:" + fromclient );
        } 
    }
}

我的 PYTHON 代码:(客户端套接字)

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 5000))

while 1:

    data = raw_input ( "SEND( TYPE q or Q to Quit):" )
    if (data <> 'Q' and data <> 'q'):
        client_socket.send(data)
    else:
        client_socket.send(data)
        client_socket.close()
        break;

输出::

在 Python 控制台(客户端)上:

SEND(TYPE q or Q to Quit):abcd (按 ENTER)

SEND(TYPE q or Q to Quit):efgh (press ENTER)

发送(键入 q 或 Q 退出):q(按 ENTER)

在 JAVA 控制台(服务器)上:

TCPServer 在端口 5000 上等待客户端

客户端 /127.0.0.1:1335 已连接

收到:abcdefghq

【问题讨论】:

  • EOL 是 EOL ('\n') - 我认为您需要发布导致错误的最少代码
  • 我忘了添加,我正在处理 TCP。
  • 提个建议:String fromclient;那里分配的效率较低。在这里分配: String fromclient = inFromClient.readLine();除此之外,代码真的很不错。
  • @AmandeepChugh 如果有任何答案解决了您的问题,请接受它。

标签: java python sockets


【解决方案1】:

\n 附加到data 的末尾:

client_socket.send(data + '\n')

【讨论】:

  • 你拯救了我的一天!
【解决方案2】:

ya..你需要在python客户端的字符串末尾添加'\n'..... 这是一个例子...... PythonTCPCLient.py

`

#!/usr/bin/env python

import socket

HOST = "localhost"
PORT = 8080

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

sock.sendall("Hello\n")
data = sock.recv(1024)
print "1)", data

if ( data == "olleH\n" ):
    sock.sendall("Bye\n")
    data = sock.recv(1024)
    print "2)", data

    if (data == "eyB}\n"):
        sock.close()
        print "Socket closed"

`

下面是java代码: JavaServer.java `

 import java.io.*;
import java.net.*;

class JavaServer {
    public static void main(String args[]) throws Exception {
        String fromClient;
        String toClient;

        ServerSocket server = new ServerSocket(8080);
        System.out.println("wait for connection on port 8080");

        boolean run = true;
        while(run) {
            Socket client = server.accept();
            System.out.println("got connection on port 8080");
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);

            fromClient = in.readLine();
            System.out.println("received: " + fromClient);

            if(fromClient.equals("Hello")) {
                toClient = "olleH";
                System.out.println("send olleH");
                out.println(toClient);
                fromClient = in.readLine();
                System.out.println("received: " + fromClient);

                if(fromClient.equals("Bye")) {
                    toClient = "eyB";
                    System.out.println("send eyB");
                    out.println(toClient);
                    client.close();
                    run = false;
                    System.out.println("socket closed");
                }
            }
        }
        System.exit(0);
    }
}

` 参考:Python TCP Client & Java TCP Server

【讨论】:

    【解决方案3】:

    这是一个相同的工作代码: Jserver.java

    import java.io.*;
    import java.net.*;
    import java.util.*;
    public class Jserver{
    public static void main(String args[]) throws IOException{
        ServerSocket s=new ServerSocket(5000);
    
        try{
            Socket ss=s.accept();
            PrintWriter pw = new PrintWriter(ss.getOutputStream(),true);
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedReader br1 = new BufferedReader(new InputStreamReader(ss.getInputStream()));
            //String str[20];
            //String msg[20];
            System.out.println("Client connected..");
            while(true)
            {
                System.out.println("Enter command:");
                pw.println(br.readLine());
                //System.out.println(br1.readLine());
            }
        }
        finally{}
        }
    }
    

    客户端.py

    import socket               # Import socket module
    
    s = socket.socket()         # Create a socket object
    host = socket.gethostname() # Get local machine name
    port = 5000                # Reserve a port for your service.
    
    s.connect((host, port))
    while 1:
        print s.recv(5000)
        s.send("message processed.."+'\n')
    
    s.close 
    

    【讨论】:

      【解决方案4】:

      我知道现在已经晚了,但特别是对于您的情况,我建议您使用 RabbitMQ RPC 调用。他们的网站上有很多 Python、Java 和其他语言的示例:

      https://www.rabbitmq.com/tutorials/tutorial-six-java.html

      【讨论】: