概述
传输控制协议(TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,也是为了在不可靠的互联网络 上提供可靠的端到端字节流而专门设计的一个传输协议。
例如生活中的电话机,我想让别人能更够打通我的电话交流或者完成工作等等事务前,我还得需要做以下几件事 情:
- 买个手机
- 插上手机卡
- 设计手机为正常接听状态(即能够响铃)
- 静静的等着别人拨打
完成一个tcp服务器的功能,需要的流程如下:
- socket创建一个套接字
- bind绑定ip和port
- listen使套接字变为可以被动链接
- accept等待客户端的链接
- recv/send接收发送数据
服务器端代码:
# 开发者:Virtuous
# 开发版本:1.0
# 开发时间: 2022/9/21 11:11
from socket import *
# 1 创建一个server -socket 接收所有的客户端请求
server_socket=socket(AF_INET,SOCK_STREAM)
# 2 绑定一个 IP 和地址
host_post=('',8088)
server_socket.bind(host_post)
# 3 服务器的socket 监听 listen 让socket 处于被动,就可以接收客户端的连接请求
server_socket.listen(1) # 1: 最多挂起几个
# 4 等待客户端的连接请求,当前函数是线程阻塞(没接收到则以下所有代码不运行)的函数,accept() 返回两个值 :
# 第一个:新的socket(子socket和其中一个客户端连接) 根当前客户端分发数据,当前客户端关闭了这个 new 就没意义了
#
new_socket,client_address=server_socket.accept()
# 5 服务器接收客户端发送过来的数据 ( recv用于TCP , recvfrom用于UDP )
data=new_socket.recv(1024) #data 是字节数据 可以通过recv 接收数据的长度判断 用户是否下线了
print('服务器接受的数据是:',data.decode('utf-8'))
# 6 服务器发送数据给客户
new_socket.send('Thank you'.encode('utf-8'))
# 7 关闭服务器
new_socket.close() # 意味着当前客户端的服务已经完成
server_socket.close() # 整个服务器全部关闭
客户端代码:
# 开发者:Virtuous
# 开发版本:1.0
# 开发时间: 2022/9/21 11:35
from socket import *
client_socket=socket(AF_INET,SOCK_STREAM)
# 客户端发送连接的请求(不是传输数据)
# 定义目标服务器的 IP 和 端口号(不能随便,要和服务器一样)
server_ip_port=('172.20.10.4',8088)
client_socket.connect(server_ip_port)
send_data=input("请输入:")
client_socket.send(send_data.encode('utf-8'))
# 接收服务器返回的数据
recv_data=client_socket.recv(1024)
print('客户端接受到的服务器数据为:',recv_data.decode('utf-8'))
client_socket.close()
在我们的服务器端,我们绑定IP+
端口协议方式,将服务器的数据传输方式绑定,基于数据传输,返回指定数据连 接服务器的信息,在这里面我们完成了对数据基于tcp
的传输流程方式,当客户端需要链接服务器时,就需要使用 connect进行链接,
udp
是不需要链接的而是直接发送,但是
tcp
必须先链接,只有链接成功才能通信
tcp注意点
- tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
- tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
- tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
- 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这 个客户端服务
- listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
- 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成 功的客户端正常通信。
- 关闭accept返回的套接字意味着这个客户端已经服务完毕
- 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据 的长度来区别客户端是否已经下线
最后
以上就是爱笑小懒虫为你收集整理的网络编程--TCP的全部内容,希望文章能够帮你解决网络编程--TCP所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复