第十六天
socket编程-tcp客户端、服务端
TCP协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP实现通信三步走:
1、创建连接;
2、数据传输
3、终止连接
udp和tcp通信的区别:
udp通信模型中,在通信开始前,不需要创建连接,类似生活中写信,每一封信都要写收件人的地址,udp不面向连接,知道对方的ip和端口,发送数据就可以了,但是只适合发送少量数据、并且不保证可靠的数据传输。
而tcp通信模型中,通信开始前一定要先创建连接,才可以发送数据,类似于生活中的打电话,相对安全,数据传输可靠,适合发送大量数据;但是tcp传输速度慢、对资源要求较多。
注意:tcp严格区分客户端、服务器。udp通信协议不怎么区分客户端、服务端。
1、tcp客户端
创建tcp客户端步骤:
1、创建socket
2、建立连接
3、接收服务端数据
4、发送数据
5、断开连接
下面我们创建一个tcp_client.py文件,代码如下
import socket
def main():
# 1、创建tcp套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、建立连接
server_ip = input('请输入服务端ip')
server_port = int(input('请输入服务端端口'))
server_address = (server_ip,server_port) # 服务端地址 元组表示
tcp_client.connect(server_address)
# 3、接收服务端数据
receiver_data = tcp_client.recv(1024)
print('接收到服务端的数据',receiver_data.decode('gbk'))
# 4、发送数据
send_data = input('请输入要发送的信息')
tcp_client.send(send_data.encode('gbk'))
# 5、断开连接
tcp_client.close()
if __name__ == '__main__':
main()
在客户端这里,我们依然利用网络测试助手来测试,注意要将网络测试助手协议类型改为TCP Server。
2、tcp服务端
创建tcp服务端步骤:
1、创建socket
2、绑定监听端口
3、多线程接收客户端连接
4、数据接收与发送
下面我们创建一个tcp_server.py文件,代码如下
import socket
def main():
#1、创建socket
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2、绑定监听端口
tcp_server.bind(('',10000))
#被动监听listen
tcp_server.listen(128)
#3、接收客户端连接 accept方法返回值是元组 accept()阻塞方法
new_client_socket, tcp_client_addr = tcp_server.accept()
print("客户端的ip地址和端口号:", tcp_client_addr)
#4、数据接收与发送 服务器一般先接收数据 后发送数据
rece_data = new_client_socket.recv(1024)
print('接收到的数据',rece_data)
new_client_socket.send('内容已经接收'.encode('gbk'))
#5、关闭
new_client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()
注意测试的时候目前依然使用的是网络测试工具,记得将协议类型改为TCP Client,重要的是服务器要先启动。
我们上述已经实现了客户端和服务端,但是我们的服务端是有问题的,但是正常状态下应该一个服务端对应多个客户端,但是目前我们的服务端不是,下面我们简单优化一下。
import socket
def main():
#1、创建socket
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#2、绑定监听端口
tcp_server.bind(('',10000))
#被动监听listen
tcp_server.listen(128)
while True:
print('等待新的客户端连接')
#3、接收客户端连接 accept方法返回值是元组 accept()阻塞方法
new_client_socket, tcp_client_addr = tcp_server.accept()
print('已经连接到一个客户端')
print("客户端的ip地址和端口号:", tcp_client_addr)
while True:
#4、数据接收与发送 服务器一般先接收数据 后发送数据
rece_data = new_client_socket.recv(1024)
print('客户端发送过来的数据为',rece_data.decode('gbk'))
# 如果获取不到客户端发送的数据 内循环也就结束了 存在则给与响应数据
if rece_data:
# 告知客户端数据已经收到
new_client_socket.send('内容已经接收'.encode('gbk'))
else:
break
#5、关闭
new_client_socket.close()
print('这个客户端服务完毕')
tcp_server.close()
if __name__ == '__main__':
main()
3、最后
实际业务开发中用的最多的其实还是tcp编程,在代码过程中,体会tcp与udp的区别,体会tcp客户端、tcp服务端的区别。下节我们来说下Python中的线程、进程。
网友评论