Python网络通信(2)— 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()