- tcp套接字
步骤
1.tcp套接字的概念
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
- tcp通信模型,需要在通信开始前,建立相关的链接,类似于现实生活中的打电话。
2.tcp的特点
- 面向连接:通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。双方间的数据传输都可以通过这一个连接进行。完成数据交换后,双方必须断开此连接,以释放系统资源。(一对一、TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议)
- 可靠传输:①tcp采用发送应答机制②超时重传③错误校④流量控制和阻塞管理
3.udp的特点
udp通信模型中,在通信开始之前,不需要建立相关的链接。
4.tcp与udp的不同点
- 面向连接(确认有创建三方交握,连接已创建才作传输。)
- 有序数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制
5.tcp严格区分客服端与服务端
5.1 客户端
- 创建套接字(SOCK_STREAM)
- 链接服务器
- 发送数据/接收数据
- 关闭套接字
import socket
def main():
# 1. 创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 链接服务器
# tcp_socket.connect(("192.168.57.65", 8080))
server_ip = input("请输入要链接的服务器的ip:")
server_port = int(input("请输入要链接的服务器的port:"))
server_addr = (server_ip, server_port)
tcp_socket.connect(server_addr)
# 3. 发送数据/接收数据
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
# 4. 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
5.2 服务端
- 创建套接字(买个手机)
- 绑定本地信息(插入手机卡)
- 设置监听(设计手机响铃模式)
- 等待客户链接(等待别人的电话)
- 接收客服请求
- 发送信息
- 关闭套接字(两个)
import socket
def main():
# 1. 买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("", 7890))
# 3. 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
print("-----1----")
# 4. 等待别人的电话到来(等待客户端的链接 accept)
new_client_socket, client_addr = tcp_server_socket.accept()
print("-----2----")
print(client_addr)
# 接收客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print(recv_data.decode("gbk"))
# 回送一部分数据给客户端
new_client_socket.send("hahahghai-----ok-----".encode("utf-8"))
# 关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
6.循环为多个客户端服务
import socket
def main():
# 1. 买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("", 7890))
# 3. 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
while True:
print("等待一个新的客户端的到来...")
# 4. 等待别人的电话到来(等待客户端的链接 accept)
new_client_socket, client_addr = tcp_server_socket.accept()
print("一个新的客户端已经到来%s" % str(client_addr))
# 接收客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print("客户端福送过来的请求是:%s" % recv_data.decode("gbk"))
# 回送一部分数据给客户端
new_client_socket.send("hahahghai-----ok-----".encode("utf-8"))
# 关闭套接字
# 关闭accept返回的套接字 意味着 不会在为这个客户端服务
new_client_socket.close()
print("已经服务器完毕。。。。")
# 如果将监听套接字 关闭了,那么会导致 不能再次等待新客户端的到来,即xxxx.accept就会失败
tcp_server_socket.close()
if __name__ == "__main__":
main()
7.循环为多个客户端服务且多次服务一个客户端
import socket
def main():
# 1. 买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind(("", 7890))
# 3. 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
# 循环目的:调用多次accept,从而为多个客户端服务
while True:
print("等待一个新的客户端的到来...")
# 4. 等待别人的电话到来(等待客户端的链接 accept)
new_client_socket, client_addr = tcp_server_socket.accept()
print("一个新的客户端已经到来%s" % str(client_addr))
# 循环目的: 为同一个客户端 服务多次
while True:
# 接收客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print("客户端发送过来的请求是:%s" % recv_data.decode("gbk"))
# 如果recv解堵塞,那么有2种方式:
# 1. 客户端发送过来数据
# 2. 客户端调用close导致而了 这里 recv解堵塞
if recv_data:
# 回送一部分数据给客户端
new_client_socket.send("hahahghai-----ok-----".encode("utf-8"))
else:
break
# 关闭套接字
# 关闭accept返回的套接字 意味着 不会在为这个客户端服务
new_client_socket.close()
print("已经为这个客户端服务完毕。。。。")
# 如果将监听套接字 关闭了,那么会导致 不能再次等待新客户端的到来,即xxxx.accept就会失败
tcp_server_socket.close()
if __name__ == "__main__":
main()