python 网络编程——套接字
一、服务端:1.实例化socket对象3.监听4.sock:当次链接对象,addr:客户端的地址, ip+port,地址加端口5. 拿到数据, 一次最多接收1024个字节的数据6. 发送客户端的数据7. 断开当次链接对象链接8.断开服务端二、客户端1.创建客户端socket对象2.向服务端发送数据3.接收服务端发来的数据
一、服务端:
1.实例化socket对象
在任何类型的通信开始之前,网络应用程序都必须创建套接字。
socket.socket(参数一family,参数二type,参数三protocol)
参数一family(套接字家族):①AF_UNIX;②AF_INET
参数二type(套接字类型):
①SOCK_STREAM(流式套接字,面向连接);
②SOCK_DGRAM(dgram取名来自于datagram,即数据报,面向非连接)
注:参数不传递默认代表是TCP协议,
参数三protocol:一般不填默认为0.
只要使用TCP/IP协议簇,该值就是AF_INET,这个是雷打不动的。
#TCP协议实例化socket服务器端对象import socket
server = socket.socket(AF_INET,SOCK_STREAM)
#UDP协议实例化socket服务器端对象
import socket
server = socket.socket(AF_INET,SOCK_DGRAM)
2.绑定
| 服务器端套接字 | |
|---|---|
| ☆s.bind() | 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。 |
| s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 |
| s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
server.bind(("127.0.0.0",8001))
有两个括号,里面是元组,第一个是ip地址,格式是字符串;第二个是端口,格式是整型数字,范围在0~65535 其中0~1024是预留给系统保留使用。
3.监听
server.listen(backlog = 5)
backlog可不写,只写个5。5指的是半连接池的大小。
4.sock:当次链接对象,addr:客户端的地址, ip+port,地址加端口
sock,addr = server.accept()
5. 拿到数据, 一次最多接收1024个字节的数据
data = sock.recv(1024) print(data)
6. 发送客户端的数据
sock.send(data.upper())
7. 断开当次链接对象链接
sock.close()
8.断开服务端
server.close()
————————————————————————
二、客户端
1.创建客户端socket对象
import socket
client = socket.socket() client.connect(('127.0.0.1',8001))
2.向服务端发送数据
client.send(b'hello baby')
3.接收服务端发来的数据
data = client.recv(1024) print(data) client.close()
————————————————————————————————————
####
####
| 客户端套接字 | |
|---|---|
| s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
| s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 |
套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)
有两种类型的套接字:基于文件的和面向网络的。
基于文件的 家族名:AF_UNIX (又名AF_LOCAL,在POSIX1.g标准中指定),它代表地址家族(addressfamily):UNIX。其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocolfamily),并使用其缩写PF而非AF。类似地,AF_LOCAL(在2000~2001年标准化)将代替AF_UNIX
面向网络的 家族名:AF_INET 或者地址家族:因特网。另一个地址家族AF_INET6用于第6版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前AF_INET是使用得最广泛的
总的来说,Python只支持AF_INET、AF_UNIX、AF_NETLINK和AF_TIPC家族
套接字地址:主机-端口对 做个比喻,套接字就像一个电话插孔,主机名和端口号就像区号和号码。 当程序之间需要通信时,需要知道对端的主机名(IP)和端口号。 有效的端口号范围为0~65535(小于1024的端口号预留给了系统)
面向连接的套接字与无连接的套接字 面向连接的套接字 TCP套接字的名字SOCK_STREAM。 特点:可靠,开销大。 在进行通信之前必须先建立一个连接,该连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这种类型的通信也称为虚拟电路或流套接字。 实现这种连接类型的主要协议是传输控制协议(缩写 TCP) 为了创建 TCP套接字,必须使用 SOCK_STREAM 作为套接字类型。
无连接的套接字 UDP套接字的名字SOCK_DGRAM 特点:不可靠(局网内还是比较可靠的),开销小。 与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。 在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。 实现这种连接类型的主要协议是用户数据报协议(缩写 UDP)。为 了创建UDP套接字,必须使用SOCK_DGRAM作为套接字类型。
本文来自博客园,作者:LionYie,转载请注明原文链接:https://www.cnblogs.com/LionYie/articles/15206910.html

浙公网安备 33010602011771号