Back

python网络编程入门-1

最基础的python网络编程,udp/tcp的实现

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 面向无连接的传输。

  1. 创建指定类型的socket对象

udp_socket = socket(AF_INET, SOCK_DGRAM)

  1. recvfrom() 接受数据
  2. 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

面向连接的可靠传输

需要区分服务端和客户端以其实现的功能。

服务端:

  1. 创建socket对象
  2. 绑定IP和端口
  3. 监听
  4. 发送接收信息
  5. 关闭socket

客户端:

  1. 创建socket对象
  2. 连接到服务端socket
  3. 发送接收信息
  4. 关闭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网络编程就实现了,后续再学习传输相关文件

author: rose
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0