zoukankan      html  css  js  c++  java
  • Python网络通信

    day26

    网络通信

    参考:

    http://www.cnblogs.com/yuanchenqi/articles/5692716.html

     

    男生是client端,字条是socket(sk),通过sk通信。

    socket属于客户端。应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand)。

    确定对端IP地址→ 确定应用程序端口 → 确定通讯协议

    server下的方法

    bind()

    listen()

    accept()

    recv()

    send()#传送内容必须为bytes类型

    sendall()

    close()

    client下的方法

    connect()

    recv()

    send()

    aendall()

    close()

    client发送,serve接收

    serve.py

     1 import socket
     2 
     3 sk = socket.socket()#创建socket
     4 
     5 print(sk)
     6 
     7 address = ('127.0.0.1', 8000)#本机地址
     8 sk.bind(address)#为socket绑定IP和端口号
     9 
    10 sk.listen(3)#限制排队的个数
    11 print('waiting......')
    12 conn, addr = sk.accept()#conn为客户端socket对象
    13 #
    14 # inp = input('>>>')
    15 # conn.send(bytes(inp, 'utf8'))
    16 
    17 data = conn.recv(1024)#为什么用conn,而不用sk
    18 print(str(data, 'utf8'))
    19 
    20 # conn.close()#关具体对象
    21 # sk.close()#全关

    client.py

     1 import socket
     2 
     3 sk = socket.socket()
     4 
     5 print(sk)
     6 address = ('127.0.0.1', 8000)
     7 
     8 sk.connect(address)
     9 
    10 #data = sk.recv(1024)#收到的为bytes类型
    11 data = sk.send(bytes('hah', 'utf8'))
    12 
    13 #print(str(data, 'utf8'))

    运行serve.py

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    waiting......

    waiting,accept()阻塞。

    运行client.py

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    
    Process finished with exit code 0

    serve收到数据“hah”

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    waiting......
    hah
    
    Process finished with exit code 0

    client接收,serve发送

    serve.py

     1 import socket
     2 
     3 sk = socket.socket()#创建socket
     4 
     5 print(sk)
     6 
     7 address = ('127.0.0.1', 8000)#本机地址
     8 sk.bind(address)#为socket绑定IP和端口号
     9 
    10 sk.listen(3)#限制排队的个数
    11 print('waiting......')
    12 conn, addr = sk.accept()#conn为客户端socket对象
    13 
    14 inp = input('>>>')
    15 conn.send(bytes(inp, 'utf8'))
    16 
    17 # data = conn.recv(1024)#为什么用conn,而不用sk
    18 # print(str(data, 'utf8'))
    19 
    20 # conn.close()#关具体对象
    21 # sk.close()#全关

    client.py

    import socket
    
    sk = socket.socket()
    
    print(sk)
    address = ('127.0.0.1', 8000)
    
    sk.connect(address)
    
    data = sk.recv(1024)#收到的为bytes类型
    #data = sk.send(bytes('hah', 'utf8'))
    
    print(str(data, 'utf8'))

    运行serve.py

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    waiting......

    运行client.py

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>

    在serve命令行输入hello

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    waiting......
    >>>hello
    
    Process finished with exit code 0

    client命令行收到数据。

    <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
    hello
    
    Process finished with exit code 0

    不间断聊天

    client.py

     1 import socket
     2 
     3 sk = socket.socket()
     4 
     5 print(sk)
     6 address = ('127.0.0.1', 8000)
     7 sk.connect(address)
     8 
     9 while True:
    10     inp = input('>>>')
    11     if inp == 'exit':
    12         break
    13     sk.send(bytes(inp, 'utf8'))
    14 
    15     data = sk.recv(1024)
    16     print(str(data, 'utf8'))
    17 
    18 sk.close()
    19 #print(sk)

    serve.py

     1 import socket
     2 
     3 sk = socket.socket()#创建socket
     4 
     5 print(sk)
     6 
     7 address = ('127.0.0.1', 8000)#本机地址
     8 sk.bind(address)#为socket绑定IP和端口号
     9 
    10 sk.listen(3)#限制排队的个数
    11 print('waiting......')
    12 #conn, addr = sk.accept()#conn为客户端socket对象
    13 
    14 while True:
    15     conn, addr = sk.accept()
    16     print(addr)    #client打开则接收
    17     while True:
    18         #
    19         try:
    20             data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
    21         except Exception:
    22             break  #client端停止,他也停止
    23         print('.......',str(data, 'utf8'))
    24         if not data:break
    25         #
    26         inp = input('>>>')
    27         conn.send(bytes(inp, 'utf8'))
    28 
    29 sk.close()#全关

    不间断聊天,其中client若关闭,新开一个client,serve端还能继续服务。

    粘包现象(远程执行命令)

    cmd_client.py

     1 import socket
     2 
     3 sk = socket.socket()
     4 
     5 print(sk)
     6 address = ('127.0.0.1', 8001)
     7 sk.connect(address)
     8 
     9 while True:
    10     inp = input('>>>')
    11     if inp == 'exit':
    12         break
    13     sk.send(bytes(inp, 'utf8'))
    14     result_len = int(str(sk.recv(1024), 'utf8'))
    15 
    16     sk.sendall(bytes('ok', 'utf8'))#收到长度信息后,告诉server
    17 
    18     data = bytes()#初始化
    19     while len(data) != result_len: #等于原文件大小,说明接收完
    20         recv = sk.recv(1024)
    21         data += recv
    22 
    23     print(str(data, 'utf8'))
    24 
    25 sk.close()
    26 #print(sk)

    cmd_server.py

     1 import socket
     2 import subprocess
     3 sk = socket.socket()#创建socket
     4 
     5 print(sk)
     6 
     7 address = ('127.0.0.1', 8001)#本机地址
     8 sk.bind(address)#为socket绑定IP和端口号
     9 
    10 sk.listen(3)#限制排队的个数
    11 print('waiting......')
    12 #conn, addr = sk.accept()#conn为客户端socket对象
    13 
    14 while True:
    15     conn, addr = sk.accept()
    16     print(addr)    #client打开则接收
    17     while True:
    18         #
    19         try:
    20             data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
    21         except Exception:
    22             break  #client端停止,他也停止
    23         print('.......',str(data, 'utf8'))
    24 
    25         if not data:break
    26         obj = subprocess.Popen(str(data, 'utf8'), shell = True, stdout = subprocess.PIPE)
    27         cmd_result = obj.stdout.read()#以上执行结果
    28         #print(cmd_result)
    29         result_len = bytes(str(len(cmd_result)), 'utf8')
    30 
    31 
    32         conn.sendall(result_len)#
    33         #先向client发送数据,client若收到则向server发送OK,Server再发送处理结果
    34         #若连续发送,两个发送内容(长度,处理结果)可能会合并。
    35         re = conn.recv(1024)#防止粘包
    36         if str(re, 'utf8') != 'ok':
    37             break
    38         #
    39         conn.sendall(cmd_result)
    40 
    41         # conn.sendall(result_len)  # 这种方式会发生粘包现象,长度和内容合在一起了
    42         # conn.sendall(cmd_result)
    43 sk.close()#全关

    先执行server.py,再执行client.py,在client中输入命令(dir,pwd,ifconfig等)

  • 相关阅读:
    elasticsearch 心得
    elasticsearch window下配置安装
    centos 配置sentry+钉钉+邮件通知
    git 多账户链接不同gitlab仓库
    git 配置远程仓库(同一个邮箱注册多个gitlab仓库)
    配置git远程连接gitlab
    上传模型方法-断点续传方法
    three.js group遍历方法
    sql 行转列超快方法
    赴日本IT的相关注意事项和坑!!!!
  • 原文地址:https://www.cnblogs.com/112358nizhipeng/p/9872844.html
Copyright © 2011-2022 走看看