用socket做简易聊天室的问题

从服务器向客户端发送消息时没有问题
但是从客户端向服务器发送时不能立即显示 只有在服务器发送完一条才有客户端发送的上一条
客户端:
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()

阅读 4.2k
2 个回答

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

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)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题