【问题标题】:How to send and recieve messages at the same time python sockets如何同时发送和接收消息 python sockets
【发布时间】:2020-06-08 12:03:50
【问题描述】:

我正在尝试学习套接字编程,目前有以下 serverclient 代码,但问题是服务器和/或客户端不能同时发送和接收消息,它们是轮流发送和接收消息。

我查看了下面的示例,但答案似乎无法解决问题,或者我的做法有误。

Python Socket - Send/Receive messages at the same time

服务器

import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host, port))
s.listen(1)
print("Waiting for connections")
conn, addr = s.accept()
print("Client has connected")
conn.send("Welcome to the server".encode())

def recv_msg():
    while True:
        recv_msg = conn.recv(1024)
        if not recv_msg:
            sys.exit(0)
        recv_msg = recv_msg.decode()
        print(recv_msg)

def send_msg():
    send_msg = input(str("Enter message: "))
    send_msg = send_msg.encode()
    conn.send(send_msg)
    print("message sent")

while True:
    send_msg()

t = threading.Thread(target=recv_msg)
t.start()

客户

import socket
import threading
s = socket.socket()
host = socket.gethostname()
port = 8080
s.connect((host, port))
print("Connected to the server")
message = s.recv(1024)
message = message.decode()
print(message)

def recv_msg():
    while True:
        recv_msg = s.recv(1024)
        if not recv_msg:
            sys.exit(0)
        recv_msg = recv_msg.decode()
        print(recv_msg)

def send_msg():
    send_msg = input(str("Enter message: "))
    send_msg = send_msg.encode()
    s.send(send_msg)
    print("Message sent")

while True:
    send_msg()

t = threading.Thread(target=recv_msg)
t.start()

我正在尝试创建一个类似于 Whatsapp/Imessage 等的聊天应用程序(使用 kivy),我还没有找到关于如何做到这一点的教程(我所看到的所有内容都是关于创建一个聊天室),所以如果有人看到,将不胜感激。

【问题讨论】:

  • 顺便说一句,send_msg.encode() 使用您的默认编码,该编码因机器而异。相反,请选择每个人都在聊天频道 send_msg.encode('utf-8') 上使用的编码。
  • 要同时发送和接收,您可能需要两个单独的线程。一个只从服务器发送到客户端,第二个只从客户端发送到服务器。或者您必须使用一个线程,并且客户端应该定期发送带有新消息或空消息的请求(如果客户端没有要发送的内容),然后获得新的答案或空答案(如果服务器没有要发送的内容)。这样它将从服务中获取新值,并且服务器不需要在单独的套接字中发送它。
  • 我不确定我是否完全理解您的意思
  • 一个线程只能在一个方向(客户端->服务器)发送,另一个线程只能在另一个方向(服务器->客户端)发送。或者在一个线程中发送client->server,然后发送server->client,并以恒定的延迟一次又一次地重复它。如果没有要发送的内容,则发送空消息,因此它总是发送一些东西(因为对方会尝试接收一些东西)。
  • 顺便说一句:在客户端和服务器的当前代码中,您必须在运行 while True: send_msg() 之前启动线程。

标签: python multithreading sockets


【解决方案1】:

在客户端和服务器中,您必须在运行循环之前启动线程while True: send_msg()

t = threading.Thread(target=recv_msg)
t.start()

while True:
    send_msg()

编辑:

server.py

import socket
import threading
import sys

# --- functions ---

def recv_msg():
    while True:
        recv_msg = conn.recv(1024)
        if not recv_msg:
            sys.exit(0)
        recv_msg = recv_msg.decode()
        print(recv_msg)

def send_msg():
    while True:
        send_msg = input(str("Enter message: "))
        send_msg = send_msg.encode()
        conn.send(send_msg)
        print("message sent")

# --- main ---

host = socket.gethostname()
port = 8080

s = socket.socket()
s.bind((host, port))
s.listen(1)

print("Waiting for connections")
conn, addr = s.accept()

print("Client has connected")
conn.send("Welcome to the server".encode())

# thread has to start before other loop
t = threading.Thread(target=recv_msg)
t.start()

send_msg()

client.py

import socket
import threading
import sys

# --- functions ---

def recv_msg():
    while True:
        recv_msg = s.recv(1024)
        if not recv_msg:
            sys.exit(0)
        recv_msg = recv_msg.decode()
        print(recv_msg)

def send_msg():
    while True:
        send_msg = input(str("Enter message: "))
        send_msg = send_msg.encode()
        s.send(send_msg)
        print("Message sent")

# --- main ---

host = socket.gethostname()
port = 8080

s = socket.socket()
s.connect((host, port))

print("Connected to the server")

message = s.recv(1024)
message = message.decode()
print(message)

# thread has to start before other loop
t = threading.Thread(target=recv_msg)
t.start()

send_msg()

【讨论】:

  • 我已经尝试过了,但它一直停在send_msg 的输入部分,等待用户输入并且在完成send_msg 功能之前无法接收消息(即消息有已发送)
  • 您必须在客户端和服务器中的thead 之后使用send_msg()
  • 这不起作用,代码仍在 send_msg 函数处暂停,等待用户输入,然后再接收(和打印)和消息。
  • 哪个send_msg - 在客户端还是在服务器?两者都有它并且都等待用户输入。也许它等待是因为对方没有发送消息 - 两者都使用input()。你用什么系统Windows、Linux、Mac?我在 Linux 上测试过。
  • 在客户端和服务器中。我正在使用 Windows
猜你喜欢
  • 2016-01-30
  • 2019-07-04
  • 1970-01-01
  • 2018-05-03
  • 2015-11-12
  • 1970-01-01
  • 2019-07-10
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多