python网络编程
这也仅仅是python网络编程的入门,没有涉及到文件传输,也就是最基础的框架。UCP和TCP传输信息,并使用多线程进行双向通信。
python也是socket套接字的编程。
基础知识点
socket 套接字
socket 可以相当于是 “一次网络连接”
socket.socket([family[, type[, proto]]])
family : 套接字家族可以使 AF_UNIX 或者 AF_INET ;
AF 表示ADDRESS FAMILY 地址族 AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型;而 AF_UNIX 则是 Unix 系统本地通信。
type : 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM ; protocol : 一般不填,默认为0。
socket 基础的内置函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
s.bind() # 绑定地址到套接字上
s.listen() # 开启tcp监听
s.accept() # 被动接受客户端连接(阻塞)
s.connect() # 客户端连接服务端
# 接受和发送信息
# 面向连接的,只有一个参数或返回值
s.send()
s.recv()
# 面对连接的,还需要多一个元组,表明目的IP地址和端口
s.sendto()
s.recvfrom()
# 这些仅是基础,后续需要用到再说。
|
了解了这些内置的函数,就可以进行UDP TCP 编程了。
UDP
UDP 面向无连接的传输。
- 创建指定类型的socket对象
udp_socket = socket(AF_INET, SOCK_DGRAM)
- recvfrom() 接受数据
- sendto() 发送数据
recvfrom() 方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用 sendto() 就可以把数据用UDP发给客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 实现udp 双向通信,使用多线程,要注意端口号的设置(在本地测试的时候)
# 导包
from socket import *
from threading import Thread
udp_socket = socket(AF_INET, SOCK_DGRAM)
udp_socket.bind(('127.0.0.1', 8888)) # 接受信息的端口
def recv_data():
while True:
redata = udp_socket.recvfrom(1024)
print(f"收到信息:{redata[0].decode('gbk')}from{redata[1]}")
def send_data():
while True:
addr1 = ('127.0.0.1', 9999)
data = input("请输入你要传输的数据:")
udp_socket.sendto(data.encode("gbk"), addr1)
if __name__ == '__main__':
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t2.start()
t1.start()
t1.join()
t2.join()
udp_socket.close()
|
需要注意的一点是:结束网络连接后,记得关闭socket
TCP
面向连接的可靠传输
需要区分服务端和客户端以其实现的功能。
服务端:
- 创建socket对象
- 绑定IP和端口
- 监听
- 发送接收信息
- 关闭socket
客户端:
- 创建socket对象
- 连接到服务端socket
- 发送接收信息
- 关闭socket
以下是多线程实现双向通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# 服务端
# 多线程的服务端
from socket import *
from threading import Thread
def recv_data():
while True:
# 接受数据,接受到“end”就停止
redata = tcs.recv(1024).decode('gbk')
print(f"客户端说:{redata}")
if redata == "end":
break
def send_data():
while True:
msg = input(">")
tcs.send(msg.encode("gbk"))
if __name__ == '__main__':
# 1 创建socket套接字
tss = socket(AF_INET, SOCK_STREAM)
# 2 绑定信息
tss.bind(('127.0.0.1', 8888))
# 3 监听端口
tss.listen()
print("等待客户端连接......")
# 等待客户端连接,注意这里的放回的是个元组!
tcs, host = tss.accept()
print("客户端连接成功,等待传输数据")
# 4 发送和接收信息
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t1.start()
t2.start()
t1.join()
t2.join()
# 关闭
tss.close()
tcs.count()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# 多线程的客户端
from socket import *
from threading import Thread
def recv_data():
while True:
# 接受数据,接受到“end”就停止
redata = tcs.recv(1024).decode('gbk')
print(f"服务说:{redata}")
def send_data():
while True:
msg = input(">")
tcs.send(msg.encode("gbk"))
if msg == "end":
break
if __name__ == '__main__':
# 1 创建socket对象
tcs = socket(AF_INET, SOCK_STREAM)
# 2 连接服务端
tcs.connect(('127.0.0.1', 8888))
print("连接成功,")
# 3 发送和接收信息
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t2.start()
t1.start()
t1.join()
t2.join()
# 4 关闭socket
tcs.close()
|
到此,最简单的python网络编程就实现了,后续再学习传输相关文件