Эквивалент Python для отправки и получения данных из сокет-соединения

#java #python #python-3.x #sockets #python-sockets

#java #python #python-3.x #сокеты #python-сокеты

Вопрос:

У меня запущен экземпляр Java socket server, из которого я хочу получать и отправлять данные с помощью python. У меня также есть код, эквивалентный Java, для выполнения задачи, но перезапись того же процесса на Python не выполняет задание, и соединение прерывается после тайм-аута сервера.

 public class ctakesSocketClient {
    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
        Socket socket = null;
        ObjectOutputStream oos = null;
        DataInputStream ois = null;
        socket = new Socket("10.2.1.21", 6700);
        System.out.println("Connected");

        String string = "Blood Pressure";
        System.out.println("Sending request to Socket Server");
        OutputStream oStream = socket.getOutputStream();
        oStream.write(string.getBytes());
        socket.shutdownOutput();

        long started = System.currentTimeMillis();
        InputStream iStream = socket.getInputStream();
        byte[] bytes = new byte[1024]; 
        int numRead = 0;
        List<Byte> lstBytes = new ArrayList<>();
        while((numRead = iStream.read(bytes)) > 0) {
            for (int i = 0; i < numRead; i  ) {
                lstBytes.add(bytes[i]);
            }
        }
        
        byte[] result = new byte[lstBytes.size()];
        
        for(int i = 0; i < lstBytes.size(); i  ) {
            result[i] = lstBytes.get(i);
        }

        long finished = System.currentTimeMillis();
        System.out.println("Message: "   new String(result));
        System.out.println("Time taken: "   ((finished-started)/1000)   " minutes");
        socket.close();
        
    }
}
  

Написанный код на Python:

 import socket


def client_program():
    host = '10.2.1.21'
    port = 6700

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server
    print('Çonnected')
    message = input(" -> ")    'n' # take input
    print(message)
    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        client_socket.shutdown(socket.SHUT_WR)
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: '   data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()
    
if __name__ == '__main__':
    client_program()
  

Комментарии:

1. Почему вы звоните shutdown ? Можете ли вы перейти SHUT_WR к нему?

2. Почему socket send завершает работу после отправки? Если вы сделаете это, на следующей итерации цикла передача будет отключена.

3. @cup Насколько я знаю, нам нужно завершить операцию записи, прежде чем мы начнем получать данные. Пожалуйста, поправьте меня, если я ошибаюсь.

4. @MousamSingh вам не нужно закрывать его.

5. @MousamSingh: не закрывает и не выключает сокет. Просто запись и чтение. Как только сокет отключается для записи, вы больше не можете записывать данные, т. Е. цикл тогда не имеет смысла. Это неверно и в коде Java. Также не то, что send не гарантируется запись всех данных (проверьте возвращаемое значение) и recv не гарантируется чтение всех данных (проверьте возвращаемое значение). Также TCP не является протоколом обмена сообщениями, а просто заботится о байтах — определять, где начинается и заканчивается сообщение, зависит от приложения, и вам может потребоваться некоторая граница сообщения или что-то подобное.