Python网络编程,采用TCP/IP协议,
采用客户端和服务器模式,实现了多个用户同时登陆服务器。
使用了socketserver进行编程。
客户端实现代码如下:
globaldef.py文件内容如下
DATASIZE = 2048 # 接收消息的最大长度
IP = "127.0.0.1" # IP地址
PORT = 8080 # 端口号
EXIT = "exit" # 退出
client.py文件内容如下
import socket
import globaldef
import time
# 客户端代码连接服务器
class Client():
def connServer(self):
try:
# 连接服务端
self.dataConn()
while (True):
sendData = input("请输入发送信息:") # 输入需要发送的消息
self.dataSend(sendData) # 发送输入的消息
self.dataRecv() # 接收客户端消息
if (sendData == globaldef.EXIT):
break
except Exception as e:
print(e.args)
self.sock.close()
# 连接服务端
def dataConn(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 使用套接字连接服务器
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 客户端开启心跳维护
self.sock.connect((globaldef.IP, globaldef.PORT)) # 指定IP,PORT连接服务端
# 接收客户端消息
def dataRecv(self):
data = self.sock.recv(globaldef.DATASIZE).decode()
print("接收到消息...", data)
# 发送客户端消息
def dataSend(self, data):
self.sock.sendall(data.encode())
main.py文件内容如下:
from client import Client
import globaldef
# 主函数入口
if __name__ == '__main__':
client = Client()
client.connServer()
服务端代码如下
globaldef.py文件内容如下
DATASIZE = 2048 # 接收消息的最大长度
IP = "127.0.0.1" # IP地址
PORT = 8080 # 端口号
EXIT = "exit" # 退出
server.py文件内容如下
from socketserver import BaseRequestHandler
import globaldef
# 处理来自客户端的消息
class DataHandler(BaseRequestHandler):
userList = []
def handle(self):
try:
# 接收客户端的Socket
self.flage = False;
self.index = 0
connSock = self.request
#判断该用户是否已经连接
for user in self.userList:
if (user == connSock):
self.flage = True
# 如果不存在则添加至列表
if(self.flage == False) :
self.userList.append(self.request)
#获取该用户的在列表中的Socket下表
self.index = self.userList.index(connSock)
while True:
# 接收客户端发来的消息
data = self.userList[self.index].recv(globaldef.DATASIZE).decode()
if(data == globaldef.EXIT):
self.removeSock()
break
# 发送消息
self.netSend(data)
except Exception as e:
print(e.args)
# 向客户端发送消息
def netSend(self, data):
self.userList[self.index].sendall(data.encode())
# 去除已经关闭的Socket
def removeSock(self):
self.userList.remove(self.userList[self.index])
main.py文件内容如下
import sys
sys.path.append("protocol")
sys.path.append("server")
import globaldef
import socketserver
from server import DataHandler
# 主函数入口
if __name__ == '__main__':
servers = socketserver.ThreadingTCPServer((globaldef.IP, globaldef.PORT), DataHandler)
print("服务器已启动...")
servers.serve_forever()
总结:因为是多用户进行连接服务器,所以采用了
ThreadingTCPServer进行处理客户端的请求
具体请看ThreadingTCPServer TCPServer ForkingTCPServer的区别
原理可同样引申到UDP
这三个类其实就是对接收到request请求后的不同处理方法。
TCPServer是接收到请求后执行handle方法,如果前一个的handle没有结束,那么其他的请求将不会受理,新的客户端也无法加入。
而ThreadingTCPServer和ForkingTCPServer则允许前一连接的handle未结束也可受理新的请求和连接新的客户端,区别在于前者用建立新线程的方法运行handle,后者用新进程的方法运行handle