一、chatroom_client
线程任务
1.接收服务端下发的信息
2.发送自己的信息给服务端
import socket
import sys
import threading
class MessageHandler(threading.Thread):
def __init__(self, tcp_client):
super().__init__()
self.client = tcp_client
发送信息的并发任务
def run(self):
while True:
s = input("我:")
self.client.send(s.encode())
def main():
tcpclient = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpclient.connect(('127.0.0.1', 8888))
th = MessageHandler(tcpclient)
th.start()
while True:等待服务器下发的并发任务
data = tcpclient.recv(1024)
print("\r" + data.decode())
print("我:", end='')
sys.stdout.flush()
if __name__ == '__main__':
main()
二、chatroom_client
import socket
import threading
class ClientHandler(threading.Thread): 每一个客户端的处理
def __init__(self, conn, client_info, conn_ls):
super().__init__()
self.conn = conn
self.info = client_info
self.conn_ls = conn_ls
def run(self):
while True:
data = self.conn.recv(1024 * 1024)
if not data:
self.conn_ls.remove(self.conn)
break
else:
s = str(self.info).encode()
msg = s + ":".encode() + data
print(msg.decode())
for conn in self.conn_ls:
if self.conn != conn:
conn.send(msg)
def main():
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ('', int(sys.argv[1]))
addr = ('', 8888)
print(addr)
tcp_server.bind(addr)
tcp_server.listen(10)
没接入一个客户端,产生一个链接,将链接保存在列表中
conn_list = []
while True:
不停地等待其他客户端接入服务器
tcp_conn, info = tcp_server.accept()
conn_list.append(tcp_conn)
客户端接入后,专门处理客户端的信息接收于转发的线程
th = ClientHandler(tcp_conn, info, conn_list)
th.start()
if __name__ == '__main__':
main()
三、多进程
import multiprocessing
import os
import threading
import time
使用方式1
def work():
print(f"当前进程的id:{os.getpid()},父进程id{os.getppid()}")
time.sleep(2)
print(f"当前进程:{os.getpid()} 已结束")
def main():
for i in range(2):
work函数相当于 run函数 args 相当于work的参数列表
p = multiprocessing.Process(target=work, name=f"进程{i}", args=())
p.start()
class MyProcess(multiprocessing.Process):
def __init__(self):
super().__init__()
def run(self):
while True:
pass
print(f"当前进程的id:{os.getpid()},父进程id{os.getppid()},进程名称{self.name}")
time.sleep(2)
print(f"当前进程:{os.getpid()} 已结束")
def main():
for i in range(os.cpu_count()):
p = MyProcess()
p.start()
if __name__ == '__main__':
main()