简体   繁体   English

如何同时发送和接收消息python sockets

[英]How to send and recieve messages at the same time python sockets

I'm trying to learn socket programming and currently have the following server and client code however the problem is that the server and/or client can't send and recieve messages at the same time, they're taking it in turns to send and recieve messages.我正在尝试学习套接字编程,目前有以下serverclient代码,但问题是服务器和/或客户端无法同时发送和接收消息,他们轮流发送和接收消息。

I've looked at the below example but the answer doesn't seem to solve the issue, or I'm following it wrong.我看过下面的例子,但答案似乎并没有解决问题,或者我跟错了。

Python Socket - Send/Receive messages at the same time Python Socket - 同时发送/接收消息

server服务器

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()

client客户

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()

I'm ulitmately trying to create a chat app (with kivy) that sort of resembles Whatsapp/Imessage etc, I've not found a tutorial around how to do this (all the ones I've seen are about creating a chatroom) so if anyone's seen one that would be appreciated.我最终正在尝试创建一个类似于 Whatsapp/Imessage 等的聊天应用程序(使用 kivy),我还没有找到有关如何执行此操作的教程(我见过的所有教程都是关于创建聊天室的)所以如果有人看过那将不胜感激。

In client and server you have to start threads before you run loops while True: send_msg()在客户端和服务器中,您必须在运行循环之前启动线程, while True: send_msg()

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

while True:
    send_msg()

EDIT:编辑:

server.py服务器.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客户端.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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM