3.关于TCP的总结

1."客户端"和"服务器端"基于TCP通信模型

 

 2.“客户端”使用TCP 发送/接收 数据

 步骤:

1.创建TCP的socket套接字

2.链接服务器

3.发送数据给服务器

4.接收服务器端发送来的消息

5.关闭套接字

示意代码:

import socket

def main():
	# 1、创建客户端的 socket
	# socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
	# socket.SOCK_STREAM 流式套接字,只要用于 TCP 协议
	client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	
	# 2、构建目标地址
	server_ip = input("请输入服务器端的 IP 地址:")
	server_port = int(input("请输入服务器端的端口号:"))
	
	# 3、连接服务器
	# 参数:元组类型 ip 是字符串类型 端口号是整型
	client_socket.connect((server_ip, server_port))
	# 要发送给服务器端的数据
	send_data = "我是要发送给服务器端的数据"
	
	# 4、发送数据
	client_socket.send(send_data.encode("gbk"))
	
	# 5、接收服务器端恢复的消息, 没有消息会阻塞
	# 1024 表示接收的最大字节数
	recv_date= client_socket.recv(1024)
	print("接收到的数据是:", recv_date.decode('gbk'))
	
	# 6、关闭套接字
	client_socket.close()
	
if __name__ == '__main__':
 main()

 3.“服务器端”使用TCP 发送/接收 数据

步骤:

1.创建TCP的socket套接字

2.bing绑定ip地址和端口号

3.listen使套接字变为被动套接字

4.accept取出一个客户端链接,用于服务

5.recv/send接收和发送消息

6.关闭套接字

示意代码:

import socket

def main():
	# 1、创建 tcp 服务端的 socket
	server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	
	# 2、绑定
	server_socket.bind(('', 8888))
	
	# 3、listen 使套接字变为被动套接字,这样下一步就可以接收客户端的连接请求
	server_socket.listen(128)
	
	# 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
	# client_socket 用来为这个客户端服务
	# tcp_server_socket 就可以省下来专门等待其他新客户端的链接
	client_socket, client_addr = server_socket.accept()
	
	# 5、接收客户端发来的消息
	recv_data = client_socket.recv(1024)
	print("接收到客户端%s 的数据:%s" % (str(client_addr), recv_data.decode('gbk')))
	
	# 6、回复数据给客户端
	client_socket.send("收到消息".encode('gbk'))
	
	# 7、关闭套接字
	client_socket.close()
	server_socket.close()
	
if __name__ == '__main__':
	main()

4.注意点

  • tcp服务器一般都需要绑定,否则客户端容易找不到服务器
  • tcp客户端一般不绑定ip,因为是主动链接服务器的,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机。
  • tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动套接字,变成被动才可以接收别人的链接请求。
  • 当客户端需要连接服务器时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先进行连接,只有连接成功了才可以进行通信。
  • 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务。
  • listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而 accept 返回的新套接字是标识这个新客户端的
  • 关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信
  • 关闭 accept 返回的套接字意味着这个客户端已经服务完毕
  • 当客户端的套接字调用 close 后,服务器端会 recv 解阻塞,并且返回的长度为 0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线;同理 当服务器断开 tcp 连接的时候 客户端同样也会收到 0 字节数据。
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值