用socket做简易聊天室的问题

发布于 2022-09-05 22:05:33 字数 1589 浏览 11 评论 0

从服务器向客户端发送消息时没有问题
但是从客户端向服务器发送时不能立即显示 只有在服务器发送完一条才有客户端发送的上一条
客户端:
import socket
import threading
def talk(s):

while True:
    data=input()
    s.send(data.encode('utf-8'))
    if data=='exit':
        break
s.close()

def receive(s):

while True:
    data=s.recv(1024)
    if not data or data.decode('utf-8') == 'exit':
        break
    print(data.decode('utf-8'))
s.close()
print('886')

if name == '__main__':

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',8999))
print(s.recv(1024).decode('utf-8'))
r=threading.Thread(target=receive,args=(s,))
t=threading.Thread(target=talk,args=(s,))
t.start()
r.start()

服务器:
import socket
import threading
def receive(s,addr):

while True:
    data=s.recv(1024)
    if not data or data.decode('utf-8') == 'exit':
        break
    print(data.decode('utf-8'))
s.close()
print('886 %s %s'%addr)

def talk(s):

while True:
    data=input()
    s.send(data.encode('utf-8'))
    if data=='exit':
        break
s.close()

if __name__=='__main__':

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',8999))
s.listen(5)
print('waiting for connection...')
while True:
    sock,addr=s.accept()
    print('找到一个新的连接:%s:%s'%addr)
    sock.send(b'hello ')
    t=threading.Thread(target=talk,args=(sock,))
    r=threading.Thread(target=receive,args=(sock,addr))
    r.start()
    t.start()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╭⌒浅淡时光〆 2022-09-12 22:05:33

只有在服务器发送完一条才有客户端发送的上一条 这句话无法理解

春风十里 2022-09-12 22:05:33
while True:
    t=threading.Thread(target=talk,args=(sock,))
    r=threading.Thread(target=receive,args=(sock,addr))

兄弟, 你这代码在于 它在不停地创建线程, 这个应该剔到外面

官方教程:

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()

这下面的client 改成循环就发送行了


# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文