PythonIT技术篇

python网络编程

2019-07-26  本文已影响5人  枫頔

1. 网络编程基础

2. 套接字

套接字是一种“通信端点”,网络化的应用程序在开始任何通讯之前需要创建套接字。套接字分类:

面向连接的套接字:在通讯之前建立一条连接,也称为流套接字。面向连接的通信方式提供了可靠的、顺序的、不会重复的数据传输,也不会被加上数据边界。这也代表每个发送的消息可能会被拆为多份,没有顺序地正确到达目的地,然后被重新拼接起来。实现这种连接的主要协议是传输控制协议(TCP)。创建TCP套接字需要指定套接字类型为SOCK_STREAM。

无连接即数据报型的无连接套接字。即无需建立连接就可进行通讯,但此时数据到达的顺序、完整性及不重复性无法保证。数据报会保留数据边界,即数据是整个发送的。实现这种连接的主要协议是用户数据报协议(UDP)。创建UDP套接字需要指定套接字类型为SOCK_DGRAM。

2.1 套接字使用:

套接字使用流程和文件很相似:创建套接字、使用套接字收发数据、关闭套接字。

python使用socket()模块来创建套接字,完成基于套接字的网络通信。

函数 socket.socket() 创建一个 socket,该函数带有两个参数:

套接字中常用的函数如下:

image image
2.2 udp套接字

udp通信模型

img

udp服务器

recvfrom方法:

sendto方法:

img
import socket

# 定义服务器IP及端口
HOST = ""  # 字符串留空或者localhost代表本地,也可自定义Ip
PORT = 7890
ADDR = (HOST, PORT)

def main():
    # 定义服务器套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定地址
    server_socket.bind(ADDR)

    # 通信循环:收发消息
    while True:
        print("waiting for messages......")

        # 接受客户端消息
        recv_data, addr = server_socket.recvfrom(1024)
        print("receive messages:%s from %s" % (recv_data.decode("gbk"), str(addr)))

        if recv_data.decode("gbk") == "exit":
            break

        # 发送消息到客户端
        send_data = "我是UDP服务器,已接收到你发来的消息!"
        server_socket.sendto(send_data.encode("gbk"), addr)

    # 关闭服务端套接字
    server_socket.close()

if __name__ == '__main__':
    main()

udp客户端

img
import socket

# 定义要连接的服务端地址
HOST = ""
PORT = 7890
ADDR = (HOST, PORT)

def main():

    # 定义客户端套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 通信循环:收发消息
    while True:
        # 客户端先发送消息
        send_data = input("请输入要发送的数据:")

        if not send_data:
            break

        client_socket.sendto(send_data.encode("gbk"), ADDR)

        recv_data, addr = client_socket.recvfrom(1024)

        # 打印服务器发过来的数据
        print(recv_data.decode("gbk"))

    # 关闭客户端套接字
    client_socket.close()

if __name__ == '__main__':
    main()
2.3 tcp套接字

tcp通信模型

img

TCP服务器

伪代码:

img

server_socket.accept方法:

img
import socket

# 定义服务器地址:主机名/ip、端口号
Host = ''
PORT = 7890
ADDR = (Host, PORT)

def main():

    # 定义TCP套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定地址
    server_socket.bind(ADDR)

    # 开始监听(变为被动)
    server_socket.listen(128)

    # 通信循环:用来循环接受客户端连接
    while True:

        # 接受客户端连接
        tmp_socket, addr= server_socket.accept()  # 返回一个临时套接字(用于客户端通信)及客户端的地址
        print("connect from :", addr)

        # 通信循环:使用临时套接字收发数据
        while True:
            recv_data = tmp_socket.recv(1024)

            if not recv_data:
                break

            print(recv_data.decode("gbk"))

            send_data = "我是一个TCP服务器!!"
            tmp_socket.send(send_data.encode("gbk"))

        tmp_socket.close()  # 关闭临时套接字

    server_socket.close()  # 关闭监听套接字


if __name__ == '__main__':
    main()

TCP客户端

伪代码:

img img
import socket

# 定义要连接的服务器端地址
Host = ""
PORT = 7890
ADDR = (Host, PORT)

def main():

    # 定义tcp客户端套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 连接tcp服务器
    client_socket.connect(ADDR)

    # 通信循环:收发数据

    while True:

        send_data = input("请输入要发送的数据:")

        # 发送数据给服务器
        client_socket.send(send_data.encode("gbk"))

        # 从服务器接收数据并打印
        recv_data = client_socket.recv(1024)

        if not recv_data:
            break
        print(recv_data.decode("gbk"))

    client_socket.close()

if __name__ == '__main__':
    main()

tcp注意点

tcp的三次握手及四次挥手

img
上一篇 下一篇

猜你喜欢

热点阅读