网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

基于UDP协议的套接字编程

UDP套接字简单示例

服务端

import scoket

server = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

server.bind(('127.0.0.1', 8080))

server.listen(5)

while True:
data, client_addr = server.recvfrom(1024)
print(data, client_addr) server.sendto(data.upper(), client_addr)

客户端

import socket

client = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

while True:

    msg = input('请输入mag>>>')

    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))

    data, server_addr = client.recvfrom(1024)

    print(data.decode('utf-8'), server_addr)
  • UDP是无链接的,先启动哪一端都不会报错

  • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到

  • UPD协议一般不用于传输大数据。

  • UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。

基于socketserver实现并发的socket

基于TCP协议

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

socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

server类

网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

request类

网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

继承关系

网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

服务端

import socketserver

class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 通信循环
while True:
data = self.request.recv(1024)
if len(data) == 0:
break
self.request.send(data.upper()) if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True) server.serve_forever() # 代表连接循环
# 循环建立连接,每建立一个连接就会启动一个线程(服务员)+调用Myhanlder类产生一个对象,调用该对象下的handle方法,专门与刚刚建立好的连接做通信循环

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) # 指定服务端ip和端口 while True:
msg=input('>>: ').strip()
if len(msg) == 0:
continue
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data) phone.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) # 指定服务端ip和端口 while True:
msg=input('>>: ').strip()
if len(msg) == 0:
continue
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data) phone.close()

基于UDP协议

服务端

import socketserver

class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 通信循环
print(self.client_address)
print(self.request) data = self.request[0]
print('客户消息', data)
self.request[1].sendto(data.upper(), self.client_address) if __name__ == '__main__':
s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyHandler)
s.serve_forever()

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

while True:
# msg=input('>>: ').strip() #msg=''
msg = 'client1111'
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
data, server_addr = client.recvfrom(1024)
print(data) client.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

while True:
# msg=input('>>: ').strip() #msg=''
msg = 'client2222'
client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
data, server_addr = client.recvfrom(1024)
print(data) client.close()
上一篇:GridView联表搜索,排序


下一篇:ES5继承