1、socket简介
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
2、socket创建
在 Python 中 使用socket 模块的函数 socket 就可以完成:
socket.socket(AddressFamily,type)
说明:函数socket.socket创建一个 socket,返回该socket的描述符,该函数带有两个参数:
AddressFamily:
AF_INET: Internet 进程间通信
AF_UNIX: 同一台机器进程间通信
type:
SOCK_STREAM: 流式套接字,主要用于 TCP 协议
SOCK_DGRAM: 数据报套接字,主要用于 UDP 协议
3、发送UDP数据
1.创建socket
2.发送数据sendto(data,addr)
sendto:有两个参数
data:发送的数据,
是字节类型。在python3中是二进制数据(b'123'),在python2可以是str('123')
addr: 元组。有IP地址和端口号。
import socket
#1. 创建udp套接字
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#2. 准备接收方的地址
sendAddr = ('192.168.14.17',8888) #ip地址需要加单引号,端口不用加
#3. 从键盘获取数据
sendData =input('请输入要发送的数据:')
#4. 发送数据到指定的电脑上
#python2:udpSocket.sendto(sendData,sendAddr)
udpSocket.sendto(
sendData.encode('utf-8'),sendAddr)
#5. 关闭套接字
udpSocket.close()
4、接收UDP数据
1.创建socket
2.绑定端口号bind(('', 端口号))
3.等待接收数据recvfrom(字节大小)
#coding=utf-8
from socket import *
#1. 创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
bindAddr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udpSocket.bind(bindAddr)
#3. 等待接收对方发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最大字节数
#4. 显示接收到的数据
print(recvData)
print(recvData.decode('utf-8'))
#5. 关闭套接字
udpSocket.close()
5、udp网络程序-端口问题
1.一个udp网络程序,可以不绑定端口,此时操作系统会随机进行分配一个端口,每次运行的时候端口是随机变化;
2.一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的;
3.客服端的udp的端口号一般不绑定,服务器端的程序的话,是需要绑定的固定的端口。
6、单工、半双工、双工
单工数据传输只支持数据在一个方向上传输;
半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力.
7、udp总结
1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
2. udp服务器、客户端
udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分请求服务的一方称为:客户端提供服务的一方称为:服务器 3. udp绑定问题
一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况