socket的发展:AF_UNIX在本地使用文件访问。

       AF_INET在网络中访问。

原理:建立在tcp、udp写一下,三次握手之后建立socket套接字

tcp协议下的socket套接字:

python 套接字接收数据后卡死 python 本地套接字_python 套接字接收数据后卡死

运行步骤:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

socket例子:



import socket                          #服务端
import subprocess

phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #培训
phone.bind(('192.168.20.18',8086))                            #选择身体区域
phone.listen(5)                                                 #选择最大数目
print('start...')

phone.accept()                                                  #等人

while True:                                                     #对接受到的消息做处理
    conn,client_addr=phone.accept()                             #把客人的诉求和客人的身份记录在conn和client_addr本子上
    print('=>',conn,client_addr)                                #输出给头目看
    while True:
        try:  # 自己对conn本子中的客户诉求进行分析
            cmd = conn.recv(1024)  # 把客户的需求本中接到的信息用1024字节保存并装到cmd本子中
            if not cmd: break
            res = subprocess.Popen(cmd.decode('utf-8'), shell=True,  # 用subprocess模块中的Popen方法处理cmd,并把cmd的返回输出重定向
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            stdout = res.stdout.read()
            stderr = res.stderr.read()  # 输出重定向后的结果
            conn.send(stdout + stderr)  # 用conn本子记录重定向后的输出结果,并用send方法传给客户端
        except Exception:
            break  # 不能预料的错误走这里
    conn.close()  # 把conn本子关上

phone.close()                                                       #退休



#步骤:
# 服务端:建立方法(买手机、培训)>确定ip、port(绑定part)> 开始listen(确定最大连接数)》 等待accept(等待别人来)》
#         处理消息:把客户的需求保存到两个本子中》对需求本进行判断,并进行Popen处理,进行输出重定向
#         关闭本子、电话

#客户端:建立方法(卖手机、培训) 》 连接(买对方出的票) 》 对自己输入的cmd命令先进行判断。》在进行转码发送 》 把接受的回复进行读取 》 关闭电话



import socket                        #客户端
import subprocess

phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)              #跟服务端对应,做一个相应的培训
phone.connect(('192.168.20.18',8086))                              #买对方放出的固定地方的票

while True:
    cmd = input('>>:').strip()                                  #把客户端输入的信息装到cmd本中
    print(cmd)                                                   #把cmd中的客户需求打印出来
    if not cmd:break                                            #如果cmd本中的客户需求不是非空,就break  while循环
    phone.send(cmd.encode('utf-8'))                             #把客户需求用encode编码成bytes,通过电话传给服务端
    cmd_res=phone.recv(1024)                                      #把从服务端接收的返回转进cmd_res本中
    print(cmd_res.decode('gbk'))

phone.close()



小知识点:

字符编码:encode、decode、unicode(python内部表示用的编码)

encode:作用是将unicode编码转成其他编码的字符串:如str1.encode(‘gb2312’)表示将unicode的字符串转换成gb2312编码

decode:作用是将其他编码的字符串转成unicode字符串:如str1.decode(‘gb2312’)表示将gb2312的字符串转换成unicode编码