网络编程在Python中的应用,三次握手和四次挥手的理解
TCP客户端和服务器端流程图:
**
TCP客户端开发流程
**:
1.创建客户端套接字
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
客户端开发代码:
客户端代码改善:
加上while死循环可以让服务器端一直发送信息到客户端,使用判断语句是因为当服务器端断开连接时候还会默认返回一个空的字节,所以当返回空字节长度为0时候为服务器关闭。
import socket
if __name__ == '__main__':
#创建客户端套接字
user_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接服务器端套接字 使用元祖分别填入的为填入ip地址和服务器所设置的端口号
user_sock.connect(('192.168.43.51' ,8080))
#发送数据
user_sock.send('hi,我是客户端'.encode())
while True:
#接收服务端发出的数据
ret = user_sock.recv(4096)
if len(ret) == 0:
print('服务器断开连接')
else:
print('服务器返回值为:%s' %ret.decode())
if not ret:
#关闭套接字
user_sock.close()
break
**
TCP服务器端开发流程:
**
1. 创建服务器端套接字
2.绑定端口号
3.设置监听
4.等待接收客户端的连接请求
5.接收请求
6.发送请求
7.关闭接收请求的套接字,关闭服务器端套接字
- 地址重写:server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
在客户端和服务器创建套接字之后可以写上,主要为了在测试时候防止端口被占用出的错误;因为在客户端与服务器端存在2MSL 等待状态,主要是为了在四次握手关闭流程更加可靠,时间一般为30s-2min ,而重写地址后则可以不必等待2MSL时间结束再使用此端口。
服务器代码改善(多任务):
import socket
import threading
def second_sock(ack_sock, ack_adress):
while True:
#接收数据
ret = ack_sock.recv(4096)
#进行判断是否连接
if len(ret) == 0:
print('%s客户已断开' % str(ack_adress))
else:
print('客户端%s:%s' % (str(ack_adress), ret.decode()))
if not ret:
#关闭套接字
ack_sock.close()
break
# 发送数据
ack_sock.send('服务器接收到消息'.encode())
def main():
#创建服务器端套接字
server_sock = socket.socket()
#地址重写
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#绑定端口
server_sock.bind(('', 8080))
#设置监听
server_sock.listen(128)
#创建连接请求时候的套接字 ,额外获得地址
while True:
ack_sock, ack_adress = server_sock.accept()
print('%s用户进入' % str(ack_adress))
#引入子线程
thd = threading.Thread(target=second_sock, args=(ack_sock, ack_adress))
thd.start()
if __name__ == '__main__':
main()
# server_sock.close()
- 引入线程,将创建服务器端套接字也写入线程调用服务器连接后的套接字的线程,定义的second_sock中连个变量为形参,与main中的局部变量只是名字相同,可以用其他名称代替。
三次握手:
第一次握手:客户端调用connect,向服务端发起连接请求;
第二次握手:服务端收到连接请求后,向客户端发送确认连接请求,且同时向客户端发送连接请求;
第三次握手:客户端收到连接请求后,向客户端发送确认连接请求
四次挥手:
第一次挥手:客户端socket调用close(),向服务端发起释放连接请求;
第二次挥手:服务端应答客户端释放请求,同意释放连接请求
第三次挥手:服务端socket调用close(),向客户端发起释放连接请求
第四次挥手:客户端应答服务端释放请求,同意释放连接请求
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)