网络编程套接字socket的使用方法
1. 使用socket.AF_INET获取网络地址, socket.SOCK_STREAM获取流数据
判断IP端口是否被占用:
2. socket.SOL_SOCKET 和 socket.SO_REUSEADDR 帮助判断, 有加一, 参数放在最后
3. 绑定IP地址给接受变量 bind (127.0.0.1) 本机调试地址, 当然在开发中不会使用固定地址, 这里只是为方便调试
4. 使用 listen(n) 监听客户端发来的请求个数n 一般设置为5个, 这里是设置打电话, 如果是高并发则另算
5. accept 用来接收客户端发来的消息, 一般发来的消息分为两段, 一段是记录传进来的内容, 一段时间记录传进来的IP地址, 我们只需要记录内容
6. recv(n)是用来接收最大字节数 byte(n ) 个字节
7. send 发送出传进来 进行操作后的值, 发送到传入的地址上, 谁发来的就送回给谁
8. close 关闭传输
这里写一个完整的服务端接收器, 并对传进来的数据进行大写处理
传输只能是byte类型, 都是底层传输 import socket import subprocess # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 防止IP端口冲突 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # IP绑定 phone.bind(('127.0.0.1',8081)) phone.listen(5) # 5 代表最大挂起数 conn,clinet_addr = phone.accept() 将传进来的值进行分离 data = conn.recv(1024) # 最大接收byte给 conn.send(data.upper) # 加号是一个可以优化的点 conn.close() phone.close()
客户端 简单的输入一次就结束
import socket # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 连接 phone.connect(('127.0.0.1',8081)) # 发,收信息 cnd = input(">>") phone.send(cnd.encode('utf-8')) data = phone.recv(1024) print(data.decode('utf-8')) # win系统需要改成 '' gbk '' phone.close()
这样做似乎不太简洁,,如果想要多次输入, 那么就需要改进了
改进一;
解决问题1
如何多次接收并返回给客户端,
举例: 在一个餐厅, 有一个招待员, 和一个服务员, 当招待员招待完成后就是服务员招待了, 服务员每次只能接待一个客人,多余的要在
招待员中等待, 一个个的解决问题, , 这样可以解决多用户访问, 这里要使用 try 采集错误, 因为每个客户端停止访问时, 服务端还会
继续监听, 当服务端监听不到地址时会报错, 当监听到错误时立即停止对这个 "人" 的招待, 进行下一个处理.
问题2 当输入为空格时, eccept 不会对空字符进行处理, 空类型转换不了>> byte类型, 导致系统中无法编码发送, 这样就停留在客户端
没有发送出去, 客户端也不能再接收数据, 导致客户端崩盘
解决代码如下:
服务端
import socket import subprocess # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # IP绑定 phone.bind(('127.0.0.1',8081))
接收用户个数 while True: phone.listen(5) # 5 代表最大挂起数 conn,clinet_addr = phone.accept()
处理用户问题 while True:
当客户端断开连接时铺抓错误进行终止对服务 try: data = conn.recv(1024) # 处理空 if not data:break conn.send(daga.upper()) except ConnectionResetError: break conn.close() phone.close()
客户端
import socket # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) # 连接 phone.connect(('127.0.0.1',8081))
让用户可多次输入对话 while True: # 发,收信息 cnd = input(">>") if not cnd:continue 当用户输入信息为空时, 返回重新输入 phone.send(cnd.encode('utf-8')) data = phone.recv(1024) print(data.decode('utf-8')) phone.close()
编写 ssh 连接接口像xhell一样的, 简简单单就行,哈哈哈哈
那么这里先用python常用的模块演示 os模块
os 打印命令, 当输入字符串就会执行翻译成命令, 执行win里面的命令实现功能
代码演示: import os os.system("dir D:") 命令+路径即可 就是这么简单, 这是查看 d 文件下的所有目录
用套接字这么实现的呢
这里调用subprocess方法中 的 Popen()方法
先解释着个模块是干嘛用的
1, 是管理和创建进程的, 就是创建命令来实现管理目录
实现方法 这里是服务端, 要在客户端输入命令来实现
import socket # subprocess 可以帮助把字符串转化为命令 import subprocess # 产生载体 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # IP绑定 phone.bind(('127.0.0.1',8081)) while True: phone.listen(5) # 5 代表最大挂起数 conn,clinet_addr = phone.accept() while True: try: data = conn.recv(1024) # 处理 if not data:break 这里传入字符串,修改为系统命令,可直接当做系统命令使用 obj = subprocess.Popen(data.decode('utf-8'),shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout = obj.stdout.read() stderr = obj.stderr.read() conn.send(stdout+stderr) # 加号是一个可以优化的点 except ConnectionResetError: break conn.close() phone.close()
这只是简单的实现, 还有很多功能没有实现, 如, 当字符超过1024, 则出现自留现象, 不能把超过1024的完整字节打印出来
自学.....
有错的多多指点哈, 努力更新中....