我们可以利用Python去写一个互相聊天的小程序,我们需要用到多线程和网络通信模块
服务端
import socket
import threading
def s_recv_chat_idea(conn):#发送信息的线程
with open('chat.txt', 'r', encoding = 'utf-8') as f:
f.seek(0, 2)
while True:
res = f.readline()
if res:#判断是否有消息
conn.sendall(res.encode('utf-8'))
def s_send_chat_idea(conn):#接受信息的线程
with open('chat.txt', 'a+', encoding = 'utf-8') as f:
while True:
f.write(conn.recv(1024).decode('utf-8'))
f.flush()#强制刷新接受的消息
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 5000))
s.listen(5)
while True:
conn, addr = s.accept()
#启动线程
threading.Thread(target = s_recv_chat_idea, args = (conn, ), daemon = True).start()
threading.Thread(target = s_send_chat_idea, args = (conn, ), daemon = True).start()
服务端我们利用到了两个线程分别对一个用户进行服务,一个用于接受客户端发送的信息并写入文件,另一个用于将别人发送过来的信息发送给服务的客户端
客户端
import socket
import threading
def c_recv_chat_idea(c):#负责接受信息的线程
while True:
print(c.recv(1024).decode('utf-8'), end = '')
addr = input('服务器地址:').split(':')
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect((addr[0], int(addr[1])))
name = input('聊天用户名:')
threading.Thread(target = c_recv_chat_idea, args = (c, ), daemon = True).start()#启动线程
while True:
msg = input('\r') + '\n'
c.sendall((name + ':' + msg).encode('utf-8'))#将自己的用户名和信息一起发送过去
客户端在我们连接上服务器后会起一个接收服务器发送过来的信息的线程来达到别人发消息你也能实时接受的功能,在主线程发送消息给服务器来达到发送消息的功能。
接下来就可以用多个客户端连接服务器的ip和对应端口来进行聊天了!