Python的学习之路(3)— 网络通信之TCP通信

Python的学习之路(3)— 网络通信之TCP通信

一、TCP客户端

1、建立连接
我们要使用到socket,首先要导入socket 包

import socket

创建一个tcp套接字,ipv4协议,使用SOCK_STREAM参数,不填proto,就会默认自动选择tcp协议;

	# 1、创建一个TCP服务端套接字对象
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

然后我们把把服务端的ip地址和端口号放在一个元组里准备好

	# 2. 准备服务端的地址和端口,'192.168.0.107'表示目的ip地址,12341表示目的端口号
    dest_addr = ('192.168.0.107', 12341)  # 注意这是一个元组,其中ip地址是字符串,端口号是数字

然后使用connect方法进行连接即可

	# 3、链接到服务器
    tcp_client.connect(dest_addr)

最后记得关闭套接字对象即可

    # 4、关闭套接字
    tcp_client.close()

我们使用网络调试助手创建一个服务端,运行代码,可以看到,连接成功
在这里插入图片描述
2、发送数据
我们尝试发送数据

    # 4、发送数据
    tcp_client.send("Hello, I am a tcp client.".encode("utf-8"))

可以看到,数据发送成功,服务器端已经接收到数据
在这里插入图片描述
3、接收数据
如果要接收数据,那么就可以使用recv方法等待接收即可,其参数为最大接收字节数,然后将接收到的数据 打印出来

    # 5、等待接收服务端发送过来的数据,最大接收1024个字节
    recvData = tcp_client.recv(1024)

    # 6、将接收到的数据打印出来
    print(recvData.decode("utf-8"))

运行效果如下
在这里插入图片描述
在这里插入图片描述
完整代码如下

import socket

def main():
    # 1、创建一个TCP服务端套接字对象
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 准备服务端的地址和端口,'192.168.0.107'表示目的ip地址,12341表示目的端口号
    dest_addr = ('192.168.0.107', 12341)  # 注意这是一个元组,其中ip地址是字符串,端口号是数字

    # 3、链接到服务器
    tcp_client.connect(dest_addr)

    # 4、发送数据
    tcp_client.send("Hello, I am a tcp client.".encode("utf-8"))

    # 5、等待接收服务端发送过来的数据,最大接收1024个字节
    recvData = tcp_client.recv(1024)

    # 6、将接收到的数据打印出来
    print(recvData.decode("utf-8"))

    # 7、关闭套接字
    tcp_client.close()

if __name__ == '__main__':
    main()

二、TCP服务端

1、建立服务端,等待连接
同样的,我们要使用到socket,首先要导入socket 包

import socket

创建一个tcp套接字,ipv4协议,使用SOCK_STREAM参数,不填proto,就会默认自动选择tcp协议;

	# 1、创建一个TCP服务端套接字对象
    tcp_sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

为了让客户端可以连接到,我们需要绑定一个端口号

    # 2. 绑定本地的相关信息,如果不绑定,则系统会随机分配一个端口号
    local_addr = ('', 12344)  # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
    tcp_sever.bind(local_addr)

然后我们就可以使用listen方法来监听连接了,其参数为可以等待的排队连接数量

    # 3、监听连接,使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
    tcp_sever.listen(5)

使用accept方法来等待客户端连接到这个服务器,其返回值为连接过来的客户端套接字对象和IP地址

    # 4、等待连接,其返回值为连接过来的客户端套接字对象和IP地址
    client_socket, clientAddr = tcp_sever.accept()

我们将其链接过来的客户端信息打印出来

    # 5、打印连接过来的客户端信息及其ip地址
    print("client_socket:",client_socket)
    print("clinet_addr  :",client_addr)

然后我们就可以关闭套接字了

    # 6、关闭套接字
    tcp_sever.close()

运行程序,使用网络调试助手进行连接,可以看到,连接成功
在这里插入图片描述
在这里插入图片描述
2、接收数据
当有客户端连接进来时,我们就可以使用客户端套接字等待接收对方发送过来的数据了

    # 5、等待接收对方发送过来的数据
    recv_data = client_socket.recv(1024)  # 最大接收1024个字节
    print("Recv from",client_addr,"recv_data:",recv_data)

运行,使用网络调试助手客户端发送数据,结果如下
在这里插入图片描述
3、发送数据
接收到数据以后我们发送数据回去,告诉客户端我已经接受到数据了

    # 6、返回数据到客户端
    send_data = "I have got the date:" + recv_data.decode("utf-8")
    client_socket.send(send_data.encode('utf-8'))

运行结果
在这里插入图片描述
完整代码

import socket

def main():
    # 1、创建一个TCP服务端套接字对象
    tcp_sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 绑定本地的相关信息,如果不绑定,则系统会随机分配一个端口号
    local_addr = ('', 12344)  # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
    tcp_sever.bind(local_addr)

    # 3、监听连接,使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
    tcp_sever.listen(5)

    # 4、等待连接,其返回值为连接过来的客户端套接字对象和IP地址
    client_socket, client_addr = tcp_sever.accept()

    # 5、等待接收对方发送过来的数据
    recv_data = client_socket.recv(1024)  # 最大接收1024个字节
    print("Recv from",client_addr,"recv_data:",recv_data.decode("utf-8"))

    # 6、返回数据到客户端
    send_data = "I have got the date:" + recv_data.decode("utf-8")
    client_socket.send(send_data.encode('utf-8'))

    # 7、关闭套接字
    tcp_sever.close()

if __name__ == '__main__':
    main()
发布了67 篇原创文章 · 获赞 13 · 访问量 5711

猜你喜欢

转载自blog.csdn.net/qq_38113006/article/details/105536207