python网络编程
UDP、TCP协议编程
UDP主要特点:
- 无连接;
- 尽最大努力交付
- 面向报文
- 无拥塞控制
- 首部开销小
- 支持一对一,一对多,多对一,多对多的交互通信
UDP优点传输快,适用视频在线点播,网络语音通话等
TCP特点:
- 面向连接
- 每个TCP连接点对点(一对一)
- 可靠的传输服务
- 全双工通信(手机)
- 面向字节流
TCP适用文件传输,电子邮件等,需要建立连接,数据传输,断开连接三个步骤。
socket(套接字):两个端点的程序之间的“信息通道”
服务器套接字和客户端套接字。
socket模块:
创建套接字
s=socket.socket(socket_family,socket_type,protocol)
family可以为socket.AF_INET表示IPV4,socket.AF_INET6表示IPV6
type为SOCK_STREAM表示TCP协议SOCK_DGRAM表示UDP协议
服务器端套接字方法
s.bind()将地址(ip,端口号)绑定到套接字
s.listen()设置并启动TCP监听
s.accept()被动接受TCP客户端连接,等待直到连接到达
客户端套接字方法
s.connet()主动启动TCP服务连接
通用套接字方法
s.recv()接受TCP消息
s.send()发送TCP消息
s.recvfrom()接受UDP消息
s.sendto()发送UDP消息
s.close()关闭套接字
socket.gethostname()返回主机名
UDPserver代码
#服务器端接收数据
import socket
from _socket import SOCK_DGRAM
#创建socket对象
s=socket.socket(socket.AF_INET,SOCK_DGRAM)
#地址绑定
s.bind(('127.0.0.1',50000))#IP+端口元组
#接收数据
while True:
date,addr=s.recvfrom(1024)
if date.decode()=='bye':
break
print('received message:%s from %s on %s' %(date.decode(),addr[0],addr[1]))
s.close()
UDPclient代码
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('hello'.encode(),('127.0.0.1',50000))#从命令行获取,内容+地址
s.close()
结果
在cmd下先运行server.py程序,在执行client可以看见server上面显示‘hello’
如果想要直接从命令行输入并显示
client代码
import socket import sys s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) for i in sys.argv[1:]: x=i s.sendto(x.encode() ,('127.0.0.1',50000))#从命令行获取,内容+地址 s.close()
此时我可以在client命令行下输入,结果在server上显示(如图所示)
【注释】sys.argv[]相当于从程序外部获取参数的桥梁,看做一个list就行,里面的项就是用户输入的参数。
【温馨提示】每次改完代码要记得保存哦!
TCP server代码
import socket
servers=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
servers.bind(('127.0.0.1',60000))#绑定套接字
servers.listen(5)#TCP监听
print('server is waiting for connection...')
clients,addr=servers.accept()#接受客户端请求
print('connect by %s' %addr[0])
data=clients.recv(1024).decode()#1024为最大值,接收数据
print('recevied message %s ' %data)
clients.send(('hello:%s' %data).encode())#发送数据
clients.close()
servers.close()
TCPclient代码
import socket
cs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cs.connect(('127.0.0.1',60000))
cs.send('Mary'.encode())
data=cs.recv(1024)
print('receviced sendback:%s' %data.decode())
cs.close()
结果
错误提示和改进
解决办法:任务管理器下直接结束pyhton程序
简单的serverclient通信
TCPserver代码
import socket
import sys
from _socket import AF_INET, SOCK_STREAM
s=socket.socket(AF_INET,SOCK_STREAM)
s.bind(('127.0.0.1',50000))
s.listen(5)
print('wating for you....')
clients,addr=s.accept()
print('connect by %s' %addr[0])
while True:
data=clients.recv(1024).decode()
print(data)
x=input('server:')
if x=='bye':
break
clients.send(x.encode())
clients.close()
s.close()
TCPclient代码
import socket
import sys
from _socket import AF_INET, SOCK_STREAM
cs=socket.socket(AF_INET,SOCK_STREAM)
cs.connect(('127.0.0.1',50000))
while True:
x=input('client:')
if x=='bye':
break
cs.sendall(x.encode())
data=cs.recv(1024).decode()
print(data)
cs.close()
【缺点】只能一人说一次。