Large file uploads, exception handling, UDP communications, socketserver module
1, UDP communication basically using
1, socket socket introduced
import socket
server = socket.socket(type= socket.SOCK_DGRAM)
#type不写默认是TCP协议
Server:
2, UDP has no concept of a connection pool half (the listen), and no two-way channel, without having to accept, direct communication cycle
3, there are two reception data Return Value: server.recvfrom (1024)
data,addr = server.recvfrom(1024)
print(data)#客户端的消息
print(addr)#客户端的地址
Complete server:
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
while True:
data ,addr = server.recvfrom(1024)
server.sendto(data.upper(),addr)
4, retransmission data: sendto
Client:
Without establishing a connection operation, direct access to the communication loop. However, to give a connection address , for transmitting
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1'.8080)
while True:
client.sendto(b'hello',server_address)
data,addr = client.recvfrom(1024)
Summed up the difference between UDP and TCP:
UDP is equivalent to send text messages; TCP equivalent to call
2, UDP and TCP four big difference
UDP client allows hair empty : udp have a header
udp protocol will not stick package:
It will not stick package
#客户端代码 import socket client = socket.socket(type=socket.SOCK_DGRAM) server_address = ('127.0.0.1',8080) while True: client.sendto(b'hello',server_address) client.sendto(b'hello',server_address) client.sendto(b'hello',server_address)
#服务端代码 import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1',8080)) # while True: data ,addr = server.recvfrom(1024) print(data) data ,addr2 = server.recvfrom(1024) print(data) data ,addr3 = server.recvfrom(1024) print(data)
The case of server disconnection, the client does not complain:
We will always stay in the client's "type" that line. But if you continue to enter, it will error
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
3, udp support concurrent: appears to be running simultaneously.
#服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
while True:
data ,addr = server.recvfrom(1024)#在这里接受任何向这个地址发送消息的客户端。
server.sendto(data.upper(),addr)
4, to achieve a simple version of the QQ
Client code
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = (('127.0.0.1',8080))
while True:
msg = input('>>>').encode('utf-8')
msg = '来自客户端1的信息:%s'%msg
client.sendto(msg.encode('utf-8'),server_address)
data,addr = client.recvfrom(1024)
print(data.decode('utf-8'))
Server code
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
while True:
data,addr = server.recvfrom(1024)#接收往这个地址放信息的任何客户端
print(data.decode('utf-8'))
msg = input('>>>')
server.sendto(msg.encode('utf-8'),addr)
5, socketserver module
5.1 so that support concurrent TCP
#客户端代码
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
client.send(b'hello')
data = client.recv(1024)
print(data.decode('utf-8'))
#服务端代码
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
# print('来啦 老弟')
while True:
data = self.request.recv(1024)
print(self.client_address) # 客户端地址
print(data.decode('utf-8'))
self.request.send(data.upper())
if __name__ == '__main__':
"""只要有客户端连接该地址 会自动交给自定义类中的handle方法去处理"""
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) # 创建一个基于TCP的对象
server.serve_forever() # 启动该服务对象
5.2socketserver also supports UDP
#服务端代码
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
# print('来啦 老弟')
while True:
data,sock = self.request
print(self.client_address) # 客户端地址
print(data.decode('utf-8'))
sock.sendto(data.upper(),self.client_address)
if __name__ == '__main__':
"""只要有客户端连接 会自动交给自定义类中的handle方法去处理"""
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyServer) # 创建一个基于TCP的对象
server.serve_forever() # 启动该服务对象
#客户端代码
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
client.send(b'hello')
data = client.recv(1024)
print(data.decode('utf-8'))
6, exception handling
1 What is abnormal?
Program error during operation, and no handling mechanism.
2 structural abnormalities
2.1 NameError
2.2SyntaError