1 基本概念

1.1 UDP

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。主要特点:无连接、不可靠、快速传输。

1.2 TCP

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。主要特点:基于流的方式、面向连接、可靠通信方式。

1.3 socket

不同主机上的进程之间如何通信?就是如何精准找到哪个地址哪个进程的通信,需要一个唯一标识。TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)
socekt就是 是进程间通信的一种方式,它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的。

2 网络通信流程

2.1UDP创建流程

1)创建客户端套接字
2)发送/接收数据
3)关闭套接字

python tcp 客户端 bind python udp tcp_udp

2.2TCP创建流程

TCP-client 流程
1)创建客户端套接字
2)链接服务器
3)发送/接收数据
4)关闭套接字

TCP-server流程
1)创建服务端套接字
2)绑定IP和端口
3)将套接字设置监听
4)accept等待客户端链接,并创建新的套接字
5)接收/发送数据
6)关闭两个套接字

3 编程实践

3.1UDP

import socket

def main():
    # 1.创建套接字
    udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 2.设置目的地址和端口
    dest_addr = ('192.168.0.2',7788)
    # 3.获取要发送的数据
    send_data = input("请输入要发送的数据")
    # 4.发送数据到指定主机指定程序上
    udp_client.sendto(send_data.encode('utf-8'),dest_addr)
    # 5.关闭套接字
    udp_client.close()
if __name__ == "__main__":
    main()

3.2TCP-客户端

import socket
def main():
    # 1.创建套接字
    tcp_client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.链接服务器
    tcp_client.connect(('192.168.0.2', 8088))
    # 3.发送接受数据
    send_data = input("请输入要发送的信息")
    tcp_client.send(send_data.encode("gbk"))
    recv_data = tcp_client.recv(1024)
    print(recv_data.decode("gbk"))
    # 4.关闭套接字
    tcp_client.close()

if __name__ == "__main__":
    main()

3.2TCP-服务器端

import socket
def main():
    # 1.创建套接字
    tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    # 2.绑定本地信息
    tcp_server_socket.bind(('',7788))

    # 3.设置监听
    tcp_server_socket.listen(128)
    #为多个客户服务。
    while True:
        print("等待新客户到来")
        # 4.accept等待客户端连接
        new_clinet_socket,clientAddr=tcp_server_socket.accept()
        print("新客户已经到来%s"% str(clientAddr))
        # 5.recv/send接收发送数据
        recv_data = new_clinet_socket.recv(1024)
        print("客户端发来请求是:%s" % recv_data.decode("gbk"))
        new_clinet_socket.send("ok".encode("utf-8"))
    # 6.关闭套接字
        new_clinet_socket.close()
    tcp_server_socket.close()

if __name__ == "__main__":
    main()

这里使用的网络调试助手软件,来测试是否链接成功。