第四十九篇 socket套接字编程

匿名 (未验证) 提交于 2019-12-02 23:48:02

Ŀ¼

数据从客户端---->服务端的协议

客户端请求连接服务端的过程需要经过三次握手

1.客户端首先会向服务端发出请求,这个请求中会带有一个SYN报头

2.服务端会接收到客户端的请求,然后响应客户端,并把SYN报头返回给客户端,而且返回的数据中会加一个ACK报头

3.客户端开始建立连接状态,并发送一条请求,这条请求带上返回的ACK报头,让服务端也进入连接状态

1.客户端首先发送带FIN报头的请求给服务端,请求断开连接

2.服务端接收到客户端的请求后,返回一个带ACK报头的确认请求,来表明同意断开

3.但由于可能会存在数据没有传输完全的情况,所以服务端还不会马上断开,它会等数据全部传输完毕之后,发送一条带上返回的FIN报头的请求给客户端

4.最后客户端收到请求后,返回带有ACK报头的数据给服务端,服务端接到数据之后,断开连接

1

# 自定义服务端 import socket  # 1.定义一个符合TCP协议的服务端 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP协议  # 2.绑定IP地址 server.bind(('127.0.0.1', 8000)) # 127.0.0.1 代表本地  # 8000 端口 # server.bind(('192.168.11.196', 8000)) # 填自己的IP地址也可以用于和别的电脑连接  # 3.监听 server.listen(5) # 半连接池,参数表示可以连接的电脑数量  # 4.等待客户连接... print('wait...')  # 5.连接循环(可以用于服务端与多个客户端相连) while True:          # 6. conn 指的是连接的客户端  # client_addr 客户端的IP地址     conn, client_addr = server.accept()          # 7.通信循环(可以和一个客户端交互)     while True:                  # 8.捕捉异常         try:                          # 9.接收信息 receive              info = conn.recv(1024)  # 限制接收数据的规模                          # 10.打印信息             print(info.decode('utf-8'))                          # 11.回复信息             msg = input('msg>>>')             conn.send(msg)  # 向客户端发送消息,用客户端点出来的发送方法                      except ConnectionAbortedError:             continue         except ConnectionResetError:             break            
# 自定义客户端 import socket  # 1.创建符合TCP协议的客户端 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 2.拨号(连接服务端) client.connect(('127.0.0.1', 8000)) # 必须和服务端一致  # 3.通信循环(与服务端交互) while True:          # 4.发送消息     info = input('info>>>')     client.send(info.encode('utf-8'))          # 5.接收消息     msg = client.recv(1024)  # 接收时都会规定规模限制     print(msg.decode('utf-8'))  

2.ssh

# 服务端  import socket  # 用于执行cmd命令,并把结果保存到管道中 import subprocess  server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  server.bind(('192.168.11.196', 8000))  server.listen(5)  print('wait...')  while True:     conn, client_addr = server.accept()      while True:         try:             cmd = conn.recv(1024)  # 接收客户端发来的cmd命令              # 帮你执行cmd命令,然后把执行结果保存到管道里             pipeline = subprocess.Popen(cmd.decode('utf-8'),  # 将命令解码                                         shell = True,    # 控制脚本命令                                         stderr = subprocess.PIPE,  # 保存出错的信息                                         stdout = subprocess.PIPE)   # 保存正确的信息                          # 这里的管道涉及到数据结构中的队列,先进的先出,后进的后出             # 所以我们如果输入命令是正确的,就一定要先读取正确的信息,也即是把stdout放在stderr前面             # 读取错误信息             stderr = pipeline.stderr.read()             # 读取正确信息             stdout = pipeline.stdout.read()              # 发送执行结果给客户端             conn.send(stderr)             conn.send(stdout)          # 捕捉异常并终止内层循环         except ConnectionResetError:             break
# 客户端  import socket  # 1.创建符合TCP协议的客户端 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 2.客户端连接服务端 client.connect(('192.168.11.196', 8000))  while True:     # 客户端发送cmd命令     cmd = input('>>>')     client.send(cmd.encode('utf-8'))      # 客户端接收数据并打印     data = client.recv(1024)     print(data.decode('gbk'))
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!