Python网络编程

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值