网络编程socket

网络编程套接字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的完整字节打印出来

自学.....
有错的多多指点哈, 努力更新中....
原文地址:https://www.cnblogs.com/Knge/p/13289002.html