文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

第二十九天- socketserver模

2023-01-30 22:47

关注

 

1.socketserver模块:

  socketserver,它提供了服务器中心类,可简化网络服务器的开发,内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的socket服务端。即,每个客服端请求连接到服务器时,socket服务端都会在服务器上创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。

 

 

2.socketserver的ThreadingTCPServer类:

  ThreadingTCPServer实现的socket服务器内部会为每个client创建一个“线程”,该线程用来和客户端就行交互

  使用方法
  1、创建一个继承socketserver.BaseRequestHandler的类
  2、类中必须重写一个名为handler的方法
  3、实例化一个服务器类,传入服务器地址和请求处理程序类
  4、调用serve_forever()事件循环监听

 

 

3.socketserver代码示例:

 1 import socketserver
 2 
 3 
 4 class Myserver(socketserver.BaseRequestHandler):
 5 
 6     def handle(self):  # 必须有handle方法
 7         while 1:
 8             from_client_msg = self.request.recv(1024)  # self.request 相当于conn连接通道
 9             print(from_client_msg.decode('utf-8'))
10             server_msg = input('服务端>>>').encode('utf-8')
11             self.request.send(server_msg)
12 
13 
14 if __name__ == '__main__':
15     ip_port = ('127.0.0.1',8086)
16 
17     # server是socketserver模块的ThreadingTCPServer类的实例化对象
18     server = socketserver.ThreadingTCPServer(ip_port,Myserver) # 固定写法 ip_port和上面创建的类
19     server.serve_forever()  # server对象调用一个serve_forever方法循环监听
服务端
 1 import socket
 2 import time
 3 
 4 client = socket.socket()
 5 client.connect(('127.0.0.1',8086))
 6 
 7 while 1:
 8     msg = input('客户端>>>')
 9     # time.sleep(1)
10     client.send(msg.encode('utf-8'))
11 
12     from_server_msg = client.recv(1024).decode('utf-8')
13     print(from_server_msg)
14 
15 client.close()
客户端

 

 

4.socket的方法补充:

 1 '''
 2 服务端套接字函数
 3 s.bind()    绑定(主机,端口号)到套接字
 4 s.listen()  开始TCP监听
 5 s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来
 6 
 7 客户端套接字函数
 8 s.connect()     主动初始化TCP服务器连接
 9 s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
10 
11 公共用途的套接字函数
12 s.recv()            接收TCP数据
13 s.send()            发送TCP数据
14 s.sendall()         发送TCP数据
15 s.recvfrom()        接收UDP数据
16 s.sendto()          发送UDP数据
17 s.getpeername()     连接到当前套接字的远端的地址
18 s.getsockname()     当前套接字的地址
19 s.getsockopt()      返回指定套接字的参数
20 s.setsockopt()      设置指定套接字的参数
21 s.close()           关闭套接字
22 
23 面向锁的套接字方法
24 s.setblocking()     设置套接字的阻塞与非阻塞模式
25 s.settimeout()      设置阻塞套接字操作的超时时间
26 s.gettimeout()      得到阻塞套接字操作的超时时间
27 
28 面向文件的套接字的函数
29 s.fileno()          套接字的文件描述符
30 s.makefile()        创建一个与该套接字相关的文件
31 '''

 

 

5.ftp简易上传练习:

 1 import socket
 2 
 3 
 4 def send_file_client(new_conn,client_addr):
 5     # 接收客户端要下载的文件名
 6     file_name = new_conn.recv(1024).decode('utf-8')
 7     print("客户端%s需要下载的文件是:%s"%(str(client_addr),file_name))
 8 
 9     # 打开文件读取数据
10     file_content = None
11     try:
12         with open(file_name,"rb") as f:
13             file_content = f.read()
14 
15     except Exception as e:
16         print('没有要下载的文件%s' % file_name)
17 
18     # 发送文件数据给客户端
19     if file_content:
20         new_conn.send(file_content)
21         return
22 
23 
24 def main():
25     file_server = socket.socket()
26     ip_port = ('127.0.0.1',8086)
27     file_server.bind(ip_port)
28     file_server.listen()
29 
30     while 1:
31         new_conn,client_addr = file_server.accept()
32         # 调用发送文件函数
33         send_file_client(new_conn,client_addr)
34         new_conn.close()
35 
36     file_server.close()
37 
38 
39 if __name__ == '__main__':
40     main()
server
 1 import socket
 2 
 3 
 4 def main():
 5     file_client = socket.socket()
 6     # 获取ip port
 7     server_ip = input('请输入服务器ip:')
 8     server_port = input('请输入下载的port:')
 9     # 连接服务器
10     file_client.connect((server_ip,int(server_port)))
11 
12     # 获取文件名 发给服务器
13     down_file_name = input("请输入要下载的文件名字:")
14     file_client.send(down_file_name.encode('utf-8'))
15 
16     # 接收发来的数据写入新文件
17     content = file_client.recv(1024*1024).decode('utf-8')
18     with open('new'+down_file_name,'w') as f:
19         f.write(content)
20 
21     file_client.close()
22 
23 
24 if __name__ == '__main__':
25     main()
client

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯