Как повторить связь TCP / IP в одной функции с Python? - PullRequest
0 голосов
/ 24 января 2020

Я написал следующий код TCP / IP в Python.

client.py

import socket
from contextlib import closing

def send_msg():
    host = '127.0.0.1'
    port = 4000
    buf_size = 4096

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    with closing(sock):
        sock.connect((host, port))
        sock.send(b'hello world')
    return

send_msg()

server.py

import socket
from contextlib import closing

def run_server():
    host = '127.0.0.1'
    port = 4000
    backlog = 10
    buf_size = 4096
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    with closing(sock):
        sock.bind((host, port))
        sock.listen(backlog)
        while True:
            conn, address = sock.accept()
            with closing(conn):
                msg = conn.recv(buf_size)
                print(msg)
    return

run_server()

Эти коды работали нормально.

Но я не хочу выполнять send_msg () повторно.

На самом деле я хочу написать оператор while в функции send_msg () и повторить передачу, как показано ниже:

clientError.py

import socket
from contextlib import closing

def send_msg():
    host = '127.0.0.1'
    port = 4000
    buf_size = 4096

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    with closing(sock):
        sock.connect((host, port))
        while True:
            sock.send(b'hello world')
    return

send_msg()

Однако clientError.py выдает ошибку.

Подробности ошибки следующие.

"clientError.py", line 13, in send_msg
    sock.send(b'hello world')
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

Как я могу повторить отправку в одной функции?

1 Ответ

0 голосов
/ 24 января 2020

Я смог повторить это, изменив следующий файл server.py следующим образом.

Спасибо, Ace Shinigami.

import socket
from contextlib import closing

def run_server():
    host = '127.0.0.1'
    port = 4000
    backlog = 10
    buf_size = 4096
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    with closing(sock):
        sock.bind((host, port))
        sock.listen(backlog)
        while True:
            conn, address = sock.accept()
            with closing(conn):
                while True:
                    msg = conn.recv(buf_size)
                    print(msg)
    return

run_server()
...