局域网内服务端与客户端通信程序
前言
All right, bitches and hoes. 好久不见集美们,本可儿华丽回归写文章噜,虽然只是一些赔钱的小心得,也权当是记录一下吧。这次写的是关于局域网服务端和客户端的通信程序,使用到的是python语言。
使用工具
serversocket库
pysimplegui库(使用这个库真的很方便,但是本可人翻遍了全站几乎没有找到合适的中文教程文章。有些文章看起来是翻译了,实则没有一点用处)
核心代码
服务端
class ThreadingTCPServer(socketserver.ThreadingMixIn,socketserver.TCPServer):#继承ThreadingMixIn,使其支持多线程
pass
class Server(socketserver.BaseRequestHandler):
def setup(self):
connection_pool.append(self.request)
connection_name.append(self.client_address)
msg = '服务端已连接,你的客户序号为{}'.format(len(connection_pool)-1) # 客户端连接上了,服务器发送的消息
self.request.sendall(msg.encode('utf-8'))
print_msg(server_name,'{}已连接'.format(self.client_address))
def handle(self):
while True:
try:
data = self.request.recv(1024).decode('utf-8')
if len(data) == 0:#判断链接已经断开
connection_pool.remove(self.request)
connection_name.remove(self.client_address)
break
else:
commute_from = connection_name.index(self.client_address)
print_msg('{} to {}'.format(commute_from,server_name), data)
except:
connection_name.remove(self.client_address)
connection_pool.remove(self.request)
def finish(self):
print_msg(server_name,'{}退出连接'.format(self.client_address))
分析:这个类继承自BaseRequestHandler类,是服务端用于处理socket对象通信的主类。实现处理socket通信,需要重写BaseRequestHandler类中的三个方法:setup、handle和finish。类中的调用方法顺序为setup()–>handle()–>finish()。handle方法中的while True循环用于一直等待接受客户端发来的消息。
客户端
class Client:
def __init__(self,ip,port):
self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.s.connect(