基于python的聊天室
1.server
server用于中转消息,如果想要实现真实的聊天室,必须将server的ip设置为云服务,或者公网ip
from socket import *
from select import select
def main():
'main 主函数'
server = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) # 设置端口可立即重用
ADDR = '127.0.0.1', 5555
server.bind(ADDR) # 绑定地址
server.listen() # 监听
# 接收函数
accept(server)
def accept(server):
'accept 服务器接受函数'
# 使用select模块的select方法实现IO多路复用监听传输
rlist = [server]
wlist = []
xlist = []
while True:
rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
# 服务器接受客户端连接
if r is server:
try:
conn, addr = server.accept()
welcome(conn)
# 将客户端套接字添加到rlist中以监听
rlist.append(conn)
print("链接从:", addr)
except:
pass
else: # 服务器接受客户端的消息并转发给所有客户端
try:
data = r.recv(1024)
# 转发信息给其他客户端
data = b'\n' + data + b'\n'
print(data.decode(), end='')
for c in rlist[1:]:
if c is not r:
c.send(data)
except:
rlist.remove(r)
def welcome(client):
client.send(b'Welcome! \n')
return True
if __name__ == '__main__':
# 主函数
main()
2. client1
import os, sys
import threading
from socket import *
from select import select
def main():
'main 主函数'
client = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
if login(client):
t_recv = threading.Thread(target=recv, args=(client,))
t_send = threading.Thread(target=send_msg, args=(client,))
t_recv.start()
t_send.start()
def send_msg(client):
while True:
send_data = input("请输入要发送的数据:")
send_data = username + ":" +send_data
client.send(send_data.encode("utf-8"))
def recv(client):
# 使用select模块的select方法实现IO多路复用监听传输
rlist = [client]
wlist = []
xlist = []
while True:
rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
if r is client:
# 接受服务器发来的消息
data = client.recv(1024)
if data.decode() == '\n':
# 如果消息为回车,聊天室关闭
client.close()
os._exit(0)
else:
# 打印接收到的信息
print(data.decode(), end='')
def login(client):
'登录函数 login'
curuser = input('输入名称>')
global username
username = curuser
ADDR = '127.0.0.1', 5555
client.connect(ADDR) # 连接到服务器地址
data = curuser + ': ' + "进入房间"
client.send(data.encode())
return True
if __name__ == '__main__':
main()
3.client2
import os, sys
import threading
from socket import *
from select import select
def main():
'main 主函数'
client = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
if login(client):
t_recv = threading.Thread(target=recv, args=(client,))
t_send = threading.Thread(target=send_msg, args=(client,))
t_recv.start()
t_send.start()
def send_msg(client):
while True:
send_data = input("请输入要发送的数据:")
send_data = username + ":" +send_data
client.send(send_data.encode("utf-8"))
def recv(client):
# 使用select模块的select方法实现IO多路复用监听传输
rlist = [client]
wlist = []
xlist = []
while True:
rs, ws, xs = select(rlist, wlist, xlist)
for r in rs:
if r is client:
# 接受服务器发来的消息
data = client.recv(1024)
if data.decode() == '\n':
# 如果消息为回车,聊天室关闭
client.close()
os._exit(0)
else:
# 打印接收到的信息
print(data.decode(), end='')
def login(client):
'登录函数 login'
curuser = input('输入名称>')
global username
username = curuser
ADDR = '127.0.0.1', 5555
client.connect(ADDR) # 连接到服务器地址
data = curuser + ': ' + "进入房间"
client.send(data.encode())
return True
if __name__ == '__main__':
main()