socket只能实现同时一个服务和一个客户端实现交互,socketserver可以实现多个客户端同时和服务端交互

1.利用Socket编写简单的同一个端口容许多次会话的小案例:

服务端:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:CarsonLiimport socket
'''模拟服务端'''
server=socket.socket()
server.bind(('localhost',6969)) #绑定需要监听的端口
server.listen(5) #开始监听
print('开始等待客户端发起请求')
while True:conn,addr=server.accept() #等待客户端连接,并且返回两个参数#conn是客户端连接过来而在服务器为期生成的一个连接实例, addr为连接的地址print('服务器为客户端连接生成的实例:',conn)print('客户端连接地址:',addr)while True:data=conn.recv(1024) #接收客户端发来的信息print(data.decode())conn.send(data.upper()) #返回个客户端信息
server.close()

  客户端:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:CarsonLi
import socket
'''模拟客户端'''
client=socket.socket() #声明socket类型,同时创建socket连接对象
client.connect(('localhost',6969))
while True:msg=input('请输入需要发送的内容>>:').strip()if len(msg)==0: #输入信息为空时不发送,否则在linux下运行时会出现死循环continueelse:client.send(msg.encode("utf-8")) #发送信息 在python3以后都只能发送byte类型,data=client.recv(1024)#接收到的信息,需要定义大小print(data.decode())client.close()

  服务端运行结果:

D:\Python3.7.0\python.exe D:/PycharmProjects/OldManS14/day07/socket_server.py
开始等待客户端发起请求
服务器为客户端连接生成的实例: <socket.socket fd=436, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 64403)>
客户端连接地址: ('127.0.0.1', 64403)
第一次
第二次
第三次
第四次
第五次

  客户端运行结果:

D:\Python3.7.0\python.exe D:/PycharmProjects/OldManS14/day07/socket_client.py
请输入需要发送的内容>>:第一次
第一次
请输入需要发送的内容>>:第二次
第二次
请输入需要发送的内容>>:第三次
第三次
请输入需要发送的内容>>:第四次
第四次
请输入需要发送的内容>>:第五次
第五次
请输入需要发送的内容>>:

 2.SocketServer 支持多个客户端

'''
SocketServer 支持多个客户端
'''
import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):'''处理我们的socket,这个类必须继承socketserver.BaseRequestHandler并且实现里面的handler函数'''def setup(self):print("这里处理请求前的的事情,也可以不写")passdef handle(self):'''处理客户端请求'''while self:try:self.data = self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0]))#客户端地址print(self.data)self.request.send(self.data.upper())except ConnectionResetError as e:print("客户端断开", e)breakdef finish(self):print("处理请求完成之后的事情,也可以不写")passif __name__=="__main__":HOST,PORT = "localhost",6969# server = socketserver.TCPServer((HOST,PORT),MyTCPHandler  #不支持多并发server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) #支持多线程,多并发# server = socketserver.ForkingTCPServer((HOST, PORT), MyTCPHandler)  # 支持多进程,多并发,windows不能实现,linux上可以#server.allow_reuse_address() #解决 在 socketServer程序里面出现 地址已经被占用server.serve_forever()

 3.模拟ftp上传下载(只实现了里面的上传功能,其他功能也大同小异,就没有一一去写)

import socketserver,os,json'''模拟ftp上传下载的服务端'''class MyTCPHandler(socketserver.BaseRequestHandler):def setup(self):passdef handle(self):while True:try:self.data = self.request.recv(1024).strip()print("{}".format(self.client_address[0]))msg_dic = json.loads(self.data.decode())print(msg_dic)if hasattr(self,"server_"+msg_dic.get("action")):func = getattr(self,"server_"+msg_dic.get("action"))func(msg_dic)except ConnectionResetError as e:print(e)breakdef server_put(self,*args):'''服务端文件上传操作'''msg_dic = args[0]file_name = msg_dic.get("file_name") #文件名称file_size = msg_dic.get("file_size")#文件大小if os.path.isfile(file_name):files = file_name.split(".") #截取文件名添加new ,例如 file.txt ==> file_new.txtf = open(files[0]+"_new."+files[1],"wb")else:f = open(file_name, "wb")self.request.send(b"200 ok")recv_file_size = 0while recv_file_size < file_size:recv_data = self.request.recv(1024)f.write(recv_data)recv_file_size += len(recv_data) #大小计算else:print("file [%s] has uploaded..." % file_name)f.close()def server_get(self,*args):''' 下载文件功能 '''passdef server_del(self,*args):''' 下载删除功能 '''passif __name__ == "__main__":ip,port = "localhost",9999server = socketserver.ThreadingTCPServer((ip,port),MyTCPHandler)server.serve_forever()

  客户端:

import socket,os,json'''模拟ftp上传下载的客户端'''class MyTCPClient(object):def __init__(self):self.client=socket.socket()def help(self):passdef connection(self,ip,port):'''连接服务器'''self.client.connect((ip, port))def interactive(self):while True:input_str = input(">>:").strip()if len(input_str) == 0: continueaction = input_str.split()[0]if hasattr(self,"cmd_"+action): #用反射判断是否存在func = getattr(self,"cmd_"+action)func(input_str)else:print(action,"is not exist!")def client_put(self,*args):'''客户端文件上传操作'''input_str = args[0]input_split = input_str.split()if os.path.isfile(input_split[1]):  # 判断是否是文件file_size = os.stat(input_split[1]).st_sizemsg_dic = {"action":input_split[0],"file_name":input_split[1],"file_size":file_size}self.client.send(json.dumps(msg_dic).encode("utf-8"))  #序列化之后编码server_respone = self.client.recv(1024)  #等待客户端确认f = open(input_split[1],"rb") #打开文件for line in f:self.client.send(line)else:print(input_split[1],"upload success!")f.close() #关闭文件else:print(input_split[1], "is not exist!")def client_get(self,*args):'''文件下载操作'''passdef client_del(self,*args):'''删除功能'''passif __name__ == "__main__":tcp_client = MyTCPClient()tcp_client.connection("localhost",9999)tcp_client.interactive()

  

转载于:https://www.cnblogs.com/bert227/p/9786481.html

Python3 Socket和SocketServer 网络编程相关推荐

  1. winsock使用java编写_利用Socket进行Java网络编程(一)

    利用Socket进行Java网络编程(一) 考试吧(Exam8.com) 2003-03-04 08:00:00 评论(0)条 作者: 郗旻 Socket是网络上运行的两个程序间双向通讯的一端,它既可 ...

  2. android tcp socket框架_socket网络编程知识梳理,让你学会造轮子的能力

    在前面几篇中,我给大家介绍了socket的相关知识,也给出了详细的代码,从socket的基本介绍,到IO多路复用,以及粘包拆包,最后到心跳包问题.总的来说大概都把socket网络编程中能碰见的问题都讲 ...

  3. 【面试】TCP、UDP、Socket、HTTP网络编程面试题

    文章目录 什么是网络编程 网络编程中两个主要的问题 网络协议是什么 为什么要对网络协议分层 计算机网络体系结构 1 TCP / UDP 1.1 什么是TCP/IP和UDP 1.2 TCP与UDP区别: ...

  4. 深入浅出网络编程TCP,UDP,Socket,Http网络编程面试题

    目录 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 TCP / UDP Socket HTTP 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 OSI 参考模型         ...

  5. Linux 详解socket实现与网络编程接口

    如何理解套接字 根据底层网络机制的差异,计算机网络世界中定义了不同协议族的套接字(socket),比如 DARPA Internet 地址(Internet 套接字).本地节点的路径名(Unix 套接 ...

  6. 基于Socket的java网络编程

    为什么80%的码农都做不了架构师?>>>    1,什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常 ...

  7. micropython中文社区 socket通讯_python网络编程学习笔记(3):socket网络服务器

    服务器和客户端程序很类似,上节学习了客户端程序,这一节将仔细学习一下利用socket建立TCP服务器和UDP服务器. 1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个 ...

  8. python socket服务器_python网络编程学习笔记(三):socket网络服务器

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较.步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对象 ...

  9. Linux Socket C语言网络编程:SCTP Socket

    Table of Contents SCTP介绍 SCTP(流控制传输协议) SCTP服务 SCTP封包格式 SCTP,TCP和UDP的比较 拥塞 开环拥塞控制 闭环拥塞控制 SCTP协议的各个功能如 ...

最新文章

  1. Zabbix配置微信报警通知
  2. 谷歌Android系统在美成宠儿
  3. Kafka消息丢失、重复消费的解决方案
  4. 诈骗者如何伪造电子邮件地址,以及如何分辨
  5. 监控——《微服务设计》读书笔记
  6. 乐山市计算机学校太坑,乐山市计算机学校小规矩成就大素养
  7. NVisionXR_iOS教程五 —— 添加灯光渲染
  8. 接口测试工具之抓包工具介绍
  9. h5摄像头拍照上传php,H5调用摄像头拍照上传
  10. 音乐盒单片机c语言课程设计,基于PIC16F887单片机数字音乐盒课程设计.doc
  11. c 易语言置入代码6,易语言置入代码 , 谁碰到这种情况_精易论坛
  12. wordpress 占有率_降低WordPress网站跳出率的10条提示
  13. linux wifi驱动开发 二,Linux 下wifi 驱动开发(二)—— WiFi模块浅析
  14. 搭建hadoop集群从裸机开始
  15. 关于微信支付,支付宝支付
  16. Easy EDA #学习笔记08# | 创建元件库(原理图库与PCB封装库)
  17. 何为JAVA内部类?
  18. 使用DirectPlay进行网络互联(4)
  19. 几个pdf怎么合并在一起?
  20. 答案原文及解释《二五鱼水八情深,四六相约二定来》指什么意思是什么含义怎么理解解答!!

热门文章

  1. 记一次open-falcon手动push数据
  2. Leetcode题目:Reverse String
  3. 用Unity的Animation播放Animator动画Clip
  4. oracle中的rownum
  5. windows环境下unicode编程总结
  6. vue 2.0项目 favicon.ico不显示 解决方案
  7. 【软件测试】如何用场景法进行黑盒测试
  8. 用户模式同步之信号量小解
  9. Spring Boot与Kotlin使用Spring Data Rest创建HAL风格Restful接口
  10. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型