Python socket实现简单聊天,同步输入和接收消息
查的资料很多都是必须等待接收数据后才能再次输入。做了修改,使用多线程的形式,实现一边输入,一边接收
服务端代码
import socket import threading import sys import time spaces = " " * 50 # 主要是为了让输入和接收的消息区分开 def send_message(conn): while True: sys.stdout.write("\r") data = input("%sInput:" % spaces).strip().encode('utf-8') if not data: continue conn.send(data) def receive_message(conn): while True: messages = conn.recv(1024) messages_format = "\rReceived[{}] :{}\n{}Input:".format(time.strftime("%Y-%m-%d %H:%M:%S"), messages.decode('utf-8'), spaces) sys.stdout.write(messages_format) def server_start(): sock = socket.socket() sock.bind(('localhost', 8080)) sock.listen(1) # 实现链接循环 print("Waiting for user ...") while True: conn, addr = sock.accept() print("User is online ...") threading.Thread(target=receive_message, args=(conn,)).start() threading.Thread(target=send_message, args=(conn,)).start() if __name__ == '__main__': server_start()
客户端代码
import socket import threading import sys import time spaces = " " * 50 # 主要是为了让输入和接收的消息区分开 def send_message(socket_send): while True: messages = input("%sInput:"%spaces).strip().encode('utf-8') if not messages: continue else: socket_send.send(messages) def recevice_message(socket_receive): while True: data = socket_receive.recv(1024) messages_format = "\rReceived[{}] :{}\n{}Input:".format( time.strftime("%Y-%m-%d %H:%M:%S"), data.decode('utf-8'), spaces) sys.stdout.write(messages_format) def client_start(): sock = socket.socket() sock.connect(('localhost', 8080)) threading.Thread(target=send_message, args=(sock,)).start() threading.Thread(target=recevice_message, args=(sock,)).start() if __name__ == '__main__': client_start()