1 什么是 Socket?
2 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
3
4 socket()函数
5 Python 中,我们用 socket()函数来创建套接字,语法格式如下:
6
7 socket.socket([family[, type[, proto]]])
8 参数
9 family: 套接字家族可以使AF_UNIX或者AF_INET
10 type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
11 protocol: 一般不填默认为0.
12
13
14
15 import socket
16 from datetime import datetime
17 # 服务端
18 sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
19 host=socket.gethostname() #获取主机名称
20 port=9999
21 # 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
22 sk.bind((host,port))
23 # 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
24 sk.listen(5)
25 while True:
26 # 被动接受TCP客户端连接, (阻塞式) 等待连接的到来
27 ck,addr=sk.accept()
28 print('连接地址:%s'%str(addr),datetime.now())
29 msg='欢迎访问菜鸟教程!'+'\r\n'
30 # send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
31 ck.send(msg.encode('utf-8'))
32 ck.close()
33
34
35
36
37 import socket
38 import sys
39 from datetime import datetime
40
41 # 客户端
42 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
43 host=socket.gethostname()
44 port=9999
45 # 主动初始化TCP服务器连接。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
46 s.connect((host,port))
47 # 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
48 msg=s.recv(1024)
49 s.close()
50 print(msg.decode('utf-8'),datetime.now())
51
52
53
54
55
56
57 import socket
58
59 s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
60 s.bind(('localhost',10021))
61 print('UDP连接')
62 while True:
63 data,addr=s.recvfrom(1024)
64 print('收到数据%s:%s.'%addr)
65 s.sendto(data.decode('utf-8').upper().encode(),addr)
66
67
68
69 import socket
70
71 s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
72 addr=('localhost',10021)
73 while True:
74 data=input('请输入要处理的数据:')
75 if not data or data=='quit':
76 break
77 s.sendto(data.encode(),addr)
78 recvdata,addr=s.recvfrom(1024)
79 print(recvdata.decode('utf-8'))
80 s.close()