版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83958419
这个是 socket编程的流程,socket 的本质是个编程接口,它把应用层和传输层进行了连接。
连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
- 服务器监听
是指 服务器端socket一直是开放的状态,随时等待客户端发来请求 服务器端socket一直是开放的状态
,随时等待客 户端发来请求, 并不定位具体的客户端,而是处于等待连接的状态,实时监控网络状态。 - 客户端请求
是指由客户端的socket提出连接请求,要连接的目标是服务器端的socket。
为此,客户端的socket必须首先描述它要连接服务器的socket,指出服务器端socket的地址和端口号,
然后就向服务器端socket提出连接请求。 - 连接确认
是指当服务器端监听到或者说接收到客户端的连接请求,它就响应客户端的请求,
建立一个新的线程,把服务器端的描述发 给客户端,一旦客户端确认了此描述,连接就建立好了
而服务器端socket继续处于监听状态,继续接收其他客户端套接字的连接请求。
客户端发出请求,服务端接受并处理,并返回给相应客户端,客户端接受之后也可以继续发给服务器,
如果一直不断掉,这就是聊天系统的机制。
这个和http的请求不一样,http 是只能保持一次会话就要断掉。
为了讲清楚用代码演示上边的流程:
先写个服务端的socket 解释在代码备注内,请详细看下.
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#第一个参数是指协议族,决定了socket的地址类型,在通信中必须采用对应的地址。AF_INET决定了要用ipv4地址。
#第二个参数是指:Socket类型,决定是面向连接还是无连接,流式Socket(SOCK_STREAM)是一种面向连接的Socket,
server.bind(("0.0.0.0",8000))
#第一个参数是指 IP 地址,第二个是 端口号,这个是为了更好的让客户端进行寻址。
server.listen()
#进行监听 客户端的socket 的请求
sock,addr=server.accept()
# 会返回两个值, 第一个是scoket对象 ,另一个是socket的地址
data=sock.recv(1024)
#接受获取的数据,并可以指定大小 1024字节是 1k 大小数据。
print(data.decode("utf-8"))
server.close()
#关闭
sock.close()
#关闭
我们只做了服务端,没有客户端 是不能完成通信的.
我们来写客户端
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#第一个参数是指协议族,决定了socket的地址类型,在通信中必须采用对应的地址。AF_INET决定了要用ipv4地址。
#第二个参数是指:Socket类型,决定是面向连接还是无连接,流式Socket(SOCK_STREAM)是一种面向连接的Socket,
client.connect(("127.0.0.1",8000))
#第一个参数是指 IP 地址,第二个是 端口号
client.send("Test".encode("utf-8"))
#客户端socket 发送数据给服务端
client.close()
#关闭连接,
服务器端打印出了 接受客户端发出来的请求 Test.
现在我们改编下,我们也让服务器端返回给客户端.
代码如下 :
服务端代码添加如下:
sock.send("Hello".encode("utf8"))
#服务端发送数据
server.close()
客服端的代码添加如下:
data=client.recv(1024)
#接受的数据
print(data.decode("utf8"))
#打印结果
Hello