首页 > 解决方案 > 使用python套接字中的文本对等发送消息?

问题描述

我正在玩 python 套接字编程以更好地理解它们,并决定使用 p2p 通信。但是我面临一个问题。

你看我有两个代码:peer1 和 peer2。两者都非常简单明了。

同行1:

import socket
import time
from tqdm import tqdm

HOST = '127.0.0.1'
PORT_S = 9090
PORT_R = 8080

client_skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv_skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serv_skt.bind((HOST, PORT_R))
serv_skt.listen(1)

for i in tqdm(range(5), desc = 'You have 5 seconds to run the other peer program...'):
    time.sleep(1)


client_skt.connect((HOST,PORT_S))
# msg=client_skt.recv(1024)
# msg=msg.decode('utf-8')
# print(msg)

print("waiting for a friend...")
connection, address = serv_skt.accept()

welcome_message = "Welcome to " + HOST + " at " + str(PORT_R)

welcome_message = welcome_message.encode('utf-8')
connection.send(welcome_message)

print("Connection successful: connected to ", address)

while True:
    msg=input("Enter your message: \n")
    msg=msg.encode("utf-8")
    client_skt.sendall(msg)
    data = connection.recv(1024).decode('utf-8')
    if not data: break
    print("Recieved: ", data)

peer2 完全相同,但端口互换:

对等体2:

import socket
import time
from tqdm import tqdm

HOST = '127.0.0.1'
PORT_R = 9090
PORT_S = 8080

serv_skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serv_skt.bind((HOST, PORT_R))
serv_skt.listen(1)

for i in tqdm(range(5), desc = 'You have 5 seconds to run the other peer program...'):
    time.sleep(1)

client_skt.connect((HOST,PORT_S))
# msg=client_skt.recv(1024)
# msg=msg.decode('utf-8')
# print(msg)

print("waiting for a client...")
connection, address = serv_skt.accept()

welcome_message = "Welcome to " + HOST + " at " + str(PORT_R)

welcome_message = welcome_message.encode('utf-8')
connection.send(welcome_message)

print("Connection successful: connected to ", address)

while True:
    data = connection.recv(1024).decode('utf-8')
    if not data: break
    print("Recieved: ", data)
    msg=input("Enter your message: \n")
    msg=msg.encode("utf-8")
    client_skt.sendall(msg)
connection.close()

大多数人可能已经猜到了:我不能同时运行客户端和服务器,这会引发错误。

解决此问题的一种方法是仅休眠直到服务器绑定。它可以工作,但不能正常退出。

问:有没有其他方法可以解决这个问题?除了上面提到的方法之外,可以使用套接字实现 p2p 吗?

标签: pythonpython-3.xsocketspython-sockets

解决方案


推荐阅读