python网络编程篇2
TCP
udp通信模式
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,”写信”
tcp通信模式
udp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,”打电话”
tcp客户端
'''
TCP客户端
'''
import socket
# 创建套接字
# 在创建tcp套接字的时候应该注意,udp的套接字的type是SOCK.DGRAM
# 而tcp套接字的type是SOCK.STREAM
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置要发送的地址
sendAddr = ('192.168.136.1', 9696)
# tcp客户端连接服务器
tcp_client.connect(sendAddr)
# 发送信息
data = input('请输入需要发送的信息:')
tcp_client.send(data.encode('utf-8'))
# 接受信息,recv(n),表示允许接受的最大字节数
recv_data = tcp_client.recv(1024)
print(recv_data)
# 关闭套接字
tcp_client.close()
tcp服务器
'''
TCP服务器
'''
import socket
# 创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 使用bind关键字绑定ip和端口
tcp_server.bind(('192.168.136.1', 5656))
# 使用listen(backlog)关键字市套接字变为被动可连接
# backlog指定最多允许多少个客户连接到服务器。它的值至少为1。
# 收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
# backlog应该理解为阻塞队列的长度,总共与服务器连接的客户端一共有 backlog + 1 个。
# 阻塞队列FIFO,当连接客户端结束后阻塞队列里的第一个客服端与服务器连接成功。
tcp_server.listen(1)
# accept等待客户端的连接
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
# newSocket用来为这个客户端服务
# tcp_server就可以省下来专门等待其他新客户端的链接
newSocket,addr=tcp_server.accept()
# send/recv 发送/接受消息
# recv_data = tcp_server.recv(1024)
recv_data = newSocket.recv(1024)
print('接受到的信息:'+recv_data.decode('utf-8')+' 数据从'+str(addr)+'发出')
# 关闭套接字
# 关闭newSocket套接字只是意味着不能再为这个客户端服务,如果需要继续服务,则需要在accept()重新创建套接字
newSocket.close()
# 关闭tcp_server套接字,意味着服务器关闭
tcp_server.close()
疑问解答
1.客户端为什么不用绑定端口,而服务器端需要绑定端口?
其实绑定端口,就是编程的人员预先给服务器设置一个确定的端口,而不是由系统随机分配一个端口。
服务器绑定了某一个端口,客户端才能通过该端口向服务器发起连接请求·。如果不绑定端口,而是由系统随机分配给服务器一个端口,既然是随机的,那么客户端也不知道系统分配的是哪个端口。客户端不知道服务器的端口,还怎么与服务器通信呢?
客户端就不需要绑定端口了,系统随机分配一个就可以了。当客户端第一次向服务器发送数据时,客户端的端口号随同数据一起就给了服务器。服务器有了客户端的端口自然就可以向客户端发送数据。
当然除了绑定端口外还要绑定IP地址。