一、正常的TCP/IP协议关系
可以看到,协议主要包括链路层、网络层、传输层、应用层
二、Socket所处位置
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。
三、Socket通信具体过程
服务器端:服务器端先初始化Socket,然后与端口绑定bind,对端口进行监听listen,调用accept阻塞,等待客户端连接。在这时如果有一个客户端初始化Socket,然后连接服务器connect,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
# socket_server.py 服务端
import socket
# 建立一个服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 1234
# 绑定要监听的主机和端口号
server.bind((host, port))
# 开始监听,可以使用五个链接排队
server.listen(5)
while True:
# conn 就是客户端链接过来在服务端生成的一个链接实例
conn, addr = server.accept()
print('链接地址为:{}'.format(addr))
while True:
try:
# 接收客户端发送过来的数据
data = conn.recv(1024)
print('server recive:{}'.format(data.decode()))
# 向客户端发送数据
conn.send(data.upper())
except ConnectionResetError as e:
print('关闭了正在占线的链接')
break
# 接收客户端的连接关闭要求,关闭连接
conn.close()
# socket_client.py 客户端
import socket
client = socket.socket()
host = socket.gethostname()
port = 1234
# 连接服务端
client.connect((host, port))
while True:
msg = 'welcome to cai niao'
# 向服务端发送数据
client.send(msg.encode('utf-8'))
# 接收服务端的数据
data = client.recv(1024)
print('client recv:{}'.format(data.decode()))
client.close()
网友评论