Отправка объекта JSON на порт прослушивателя tcp при использовании Python - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть прослушиватель на локальном хосте tcp:

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 8192         # The port used by the server
def client_socket():
    while 1:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((TCP_IP,TCP_PORT))
        s.listen(1)
        while 1:
            print 'Listening for client...'
            conn, addr = s.accept()
            print 'Connection address:', addr
            data = conn.recv(BUFFER_SIZE)
            if data == ";" :
                conn.close()
                print "Received all the data"
                i=0
                for x in param:
                    print x
                #break
            elif data:
                print "received data: ", data
                param.insert(i,data)
                i+=1
                #print "End of transmission"
        s.close()

Я пытаюсь отправить объект JSON на тот же порт на локальном хосте:

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 8192         # The port used by the server
def json_message(direction):

    local_ip = socket.gethostbyname(socket.gethostname())
    data = {
        'sender' : local_ip,
        'instruction' : direction
    }

    json_data = json.dumps(data, sort_keys=False, indent=2)
    print("data %s" % json_data)

    send_message(json_data)

    return json_data



def send_message(data):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(data)
        data = s.recv(1024)

    print('Received', repr(data))

Однако яполучить ошибку сокета:

socket.error: [Errno 98] Address already in use

Что я делаю не так?Будет ли это работать или мне нужно сериализовать объект JSON?

1 Ответ

0 голосов
/ 17 ноября 2018

Есть несколько проблем с вашим кодом, но одна, которая, вероятно, решит вашу проблему, устанавливает параметр сокета SO_REUSEADDR с помощью:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

после создания сокета (с socket.socket(...)но за до вы пытаетесь связать адрес (с s.bind().

. С другой стороны, две "половины" кода довольно противоречивы - как вы копировали ивставил код из двух разных мест и попытался их использовать? (Один использует менеджер контекста и синтаксис Python 3 print, а другой использует синтаксис Python 2 print ...)

Но я написалдостаточно сокетных программ, чтобы я мог расшифровать практически все что угодно, так что вот рабочая версия вашего кода (с некоторыми довольно неоптимальными параметрами, например, размером буфера 1, но как иначе вы могли бы ожидать перехват одного ;?)

Сервер:

import socket

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 8192         # The port used by the server
BUFFER_SIZE = 1

def server_socket():
    data = []
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((HOST,PORT))
        s.listen()
        while 1: # Accept connections from multiple clients
            print('Listening for client...')
            conn, addr = s.accept()
            print('Connection address:', addr)
            while 1: # Accept multiple messages from each client
                buffer = conn.recv(BUFFER_SIZE)
                buffer = buffer.decode()
                if buffer == ";":
                    conn.close()
                    print("Received all the data")
                    for x in data:
                        print(x)
                    break
                elif buffer:
                    print("received data: ", buffer)
                    data.append(buffer)
                else:
                    break

server_socket()

Клиент:

import socket
import json

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 8192         # The port used by the server

def json_message(direction):
    local_ip = socket.gethostbyname(socket.gethostname())
    data = {
        'sender': local_ip,
        'instruction': direction
    }

    json_data = json.dumps(data, sort_keys=False, indent=2)
    print("data %s" % json_data)

    send_message(json_data + ";")

    return json_data



def send_message(data):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(data.encode())
        data = s.recv(1024)

    print('Received', repr(data))

json_message("SOME_DIRECTION")
...