Python Сокет не получает отправленные ему сообщения - PullRequest
0 голосов
/ 02 апреля 2020

Я установил сокетное соединение между клиентом и сервером. Я настроил его так, чтобы он запрашивал данные, но он не получает данные. Выдает Traceback (most recent call last): File "C:\Users\jenga\Desktop\Jacobs_Python\net\server\server.py", line 38, in <module> s1.connect((host1, port1)) ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it, но отправляет ответ. Как я могу настроить его для получения сообщения? Кстати, он делает запрос к серверу на чтение файла.

Server.py:

import json
import socket
import base64
while True:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024)
                data = repr(data)
                data = str(data)
                data1 = []
                for i in range(len(data)):
                    data1.append(data[i])
                data1[0] = ""
                data1[1] = ""
                data1[len(data1)-1] = ""
                data ="".join(data1).replace("'","\"").replace("~","=")
                if (data != ""):
                    print(data)
                    data = json.loads(data)
                    typer = data["type"]
                    if (typer == 'putreq'):
                        #Writes to file, there are no bugs here.
                    else:
                        host1 = addr[0]
                        port1 = addr[1]
                        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s1:
                            s1.connect((host1, port1))
                            with open(data["name"], 'r') as userfile:
                                data1 = userfile.read()
                            s1.sendall(bytes(base64.b64encode(bytes(data1,'utf-8')),'utf-8'))
                            s1.close
                    s.close()

Client.py:

import socket
import sys
import base64
import json
import random
import time

typec = sys.argv[1]
filec = sys.argv[2]
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        s.sendall(bytes(str({"type":'namereq',"name":filec}), "UTF-8"))
        data = s.recv(1024)
        data = repr(data)
        data = str(data)
        data1 = []
        for i in range(len(data)):
            data1.append(data[i])
        data1[0] = ""
        data1[1] = ""
        data1[len(data1)-1] = ""
        data ="".join(data1).replace("~","=")
        if(data != ''):
            print(data)

Я думаю это связано с тем, что имя хоста и порт отличаются на сервере и у пользователя.

1 Ответ

0 голосов
/ 02 апреля 2020

измените это:

                    else:
                        host1 = addr[0]
                        port1 = addr[1]
                        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s1:
                            s1.connect((host1, port1))
                            with open(data["name"], 'r') as userfile:
                                data1 = userfile.read()
                            s1.sendall(bytes(base64.b64encode(bytes(data1,'utf-8')),'utf-8'))
                            s1.close

на это:

                else:
                    with open(data["name"], 'r') as userfile:
                        data1 = userfile.read()
                    conn.sendall(bytes(base64.b64encode(bytes(data1,'utf-8')),'utf-8'))
                    conn.close

у вас уже есть сокет, подключенный к этому хосту, и порт не нужно создавать другие (также потому, что я вижу, что HOST невероятно похож на host1)

...