1 socketserver实现并发

基于tcp的套接字,关键是两个循环,一个通信循环,一个链接循环

Socketserver的 模块中分成两类:

Server类(解决连接问题)

Request类(解决通信问题)

server类:

request类:

继承关系:

#服务端
import socketserver
class FTPserver(socketserver.BaseRequestHandler):
#定义一个类,继承socketserver.BaseRequestHandler
#通讯
def handle(self):#规定一个handle 规定死的
print(self.request)#客户端的连接信息
while True:#通信循环
data=self.request.recv(1024)
print(data)
self.request.send(data.upper())
if __name__ == '__main__':
obj=socketserver.ThreadingTCPServer(("127.0.0.1",8080),FTPserver)#基于多线程实现并发
#产生一个对象
obj.serve_forever()#连接循环 #客户端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(("127.0.0.1",8080))
while True:
msg=input(">>")
if not msg:continue
phone.send(msg.encode("utf8"))
data=phone.recv(1024)
print(data)
>>
<socket.socket fd=476, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 56456)>
<socket.socket fd=408, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 56457)>
<socket.socket fd=436, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 56461)>
b'111'
b'2'
b'22'

2套接字工作流程(udp)

UDP:用户数据报协议

是无连接的

面向消息的

不会产生粘包

Udp是不可靠传输

#服务端
import socket
udpserver=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udpserver.bind(("127.0.0.1",8080))
#udp没有链接,不用listen,accpect
while True:#通讯循环
data,client_addr=udpserver.recvfrom(1024)
print(data)
print(client_addr)
msg=input(">>")
udpserver.sendto(msg,client_addr) #客户端
import socket
udpclient=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip_port=(("127.0.0.1",8080))
while True:
inp=input(">>")
udpclient.sendto(inp.encode("utf8"),ip_port) data,server_addr=udpclient.recvfrom(1024)
print(data.decode("utf8")) udp的socketserver并发
#服务端
import socketserver
class FtpServer(socketserver.BaseRequestHandler):
def handle(self):
print(self.request[0])
print(self.request[1])
self.request[1].sendto('嘎嘎嘎'.encode('utf-8'),self.client_address) if __name__ == '__main__':
obj=socketserver.ThreadingUDPServer(('127.0.0.1',8080),FtpServer)
obj.serve_forever()
#客户端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080)) while True: #通信循环
msg=input('>>: ').strip()
if not msg:continue
phone.send(msg.encode('utf-8'))
# print('has send===========>')
data=phone.recv(1024)
# print('has recv===========>')
print(data) phone.close()

  

最新文章

  1. vb上位机模拟电压监测系统
  2. 反射中通过class标记来获取字段及方法
  3. Hadoop JobHistory
  4. C++Builder和VC的比较
  5. IIS 7.0、IIS 7.5 和 IIS 8.0 中的 HTTP 状态代码 转
  6. 转载C#函数式程序设计初探——基础理论篇
  7. Android Weekly Notes Issue #238
  8. javascript----bug
  9. eclipse plugin 导出插件包
  10. ssh The authenticity of host 192.168.0.xxx can&#39;t be established
  11. Vulkan Tutorial 17 Rendering and presentation
  12. hdu5635 BestCoder Round #74 (div.2)
  13. [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;].map(parseInt)`返回的结果是[1,2,3]?
  14. unix域字节流回射程序
  15. Windows Internals 笔记——进程的权限
  16. anaconda 在内网中代理配置
  17. Http的那些事: Content-Type
  18. sas 选择一段日期,和一定周期,生成日期序列和周期序列
  19. 在Centos 6.5 X64下切割m3u8
  20. LG3804 【模板】后缀自动机

热门文章

  1. MediatR
  2. 关于sizeof与#pragma pack 以及网络上关于字节对齐的一点感想
  3. NEST - Elasticsearch 的高级客户端
  4. Nginx编译安装:
  5. Machine Learning 算法可视化实现1 - 线性回归
  6. VS2013 FFmpeg开发环境配置
  7. 关于ACtion类利用file类型取得上传文件的内容,名字和内容类型
  8. mysql order by多个字段
  9. 队列queue实现线程的消费者和生产者
  10. Idea中在代码顶部添加自定义作者和时间