TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它与UDP同在计算机网络OSI模型中同一层,处于网络层(IP层)之上,应用层之下
1、四层模型
2、Socket 抽象层
Socket 是TCP/IP协议族的通信的中间软件的抽象层,它是一组接口。对于我们无需深入了解TCP/IP协议,socket已经为我们封装好了,只需按照socket的规定去编程就行了。因此我们应该先学会socket 的用法。
socket 本质上是 ip +port,ip 是指网络上的哪一台主机,port是指定主机上的哪一个应用程序,这样就标识了网络中独一无二的一个应用程序,这样就可以实现网络上的互相通信。
3、socket 套字节的工作流程
从服务器端开始,服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据强求,服务器端接受请求并处理请求,然后把回应数据发送给客户,客户读取数据,最后关闭连接,一次交互就结束了。
4、基于socket TCP 服务端
基于socket TCP 服务端如下代码:
from socket import * #引入socket模块
ip_port = ('192.168.42.42',8080) #自定义ip/端口号
back_log = 5 #自定义监听数
buffer_size = 1024 #自定义接受最大字节数
tcp_server = socket(AF_INET,SOCK_STREAM) #创建服务器套字节,AF_INET是引用套字节家族,SOCK_STREAM是指套字节类型,ipv4
tcp_server.bind(ip_port) #把地址绑定到套字节
tcp_server.listen(back_log) #设置监听链接
while True: #设置无限循环
print('服务端开始运行了'),
conn,addr = tcp_server.accept() #服务端 准备接受 新的套字节对象,可以用来接收和发送数据,addr 是连接客户端的地址
print("接受新的套字节链接是",conn)
print('客户端地址',addr)
while True:
data = conn.recv(buffer_size) #收到的数据,是以buffer_size 的大小接收
print('客户端发来的消息是',data.decode('utf-8')) #收到的消息 data 并转码decode()
conn.send(data.upper()) #服务端 回复数据 将发送来的数据大写返回
conn.close() #套字节链接关闭
tcp_server.close() #服务器链接关闭
5、客户端
基于socket TCP 服务端如下代码:
from socket import *
ip_port = ('192.168.42.42',8080) # 地址跟服务端一样
back_log = 5
buffer_size = 1024
tcp_client = socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port) #连接服务端
while True:
msg = input('>>:').strip()
if not msg :continue #如果msg 为空的话结束本次循环
tcp_client.send(msg.encode('utf-8')) #发送访问数据
print('客户端已经发送消息')
data = tcp_client.recv(buffer_size)
print("收到服务端发来的消息",data.decode('utf-8'))
tcp_client.close()
TCP是基于链接的 必须先启用服务端,然后再启动客户端去链接服务端。
这样就建立了基于socket建立的TCP协议客户端和服务端的连接。
自己整理,欢迎指正!