zoukankan      html  css  js  c++  java
  • Socket 网络编程

    Socket 网络编程:
     
     socket 是对上层协议的封装;
     
     发送端:
      import socket
      socket.TCP/IP
      connect(a.ip,port)
      socket.send("hello")
      socket.recv()
      socket.close()
      
     接收端:
      import socket
      socket.TCP/IP
      listen(ip,port)    #监听某个地址和端口
      waiting
      recv()
      send

     地址簇:
      socket.AF_UNIX    #unix本机进程间通信
      socket.AF_INET   #IPV4
      socket.AF_INET6   #IPV6
     
     Socket Protocol Types:
      socket.SOCK_STREAM  #for tcp
      socket.SOCK_DGRAM  #for udp
      socket.SOCK_RAW   #原始套接字,普通的套接字无法处理IMCP,IGMP等网络报文,而socket.SOCK_RAW可以
             还可以处理特殊的IPV4报文
      socket.SOCK_RDM   #是一种可靠的UDP形式
      
      
     案例1:
     
      服务端:
       import socket
       server = socket.socket()
       server.bind(("127.0.0.1", 6969))
       server.listen()                          # 监听
       conn, addr = server.accept()             # 等待消息
       print(conn, addr)
       data = conn.recv(1024)
       print("receive:", data)
       conn.send(data.upper())
       server.close()
       
      客户端:
       import socket
       conn = socket.socket()         # 声明socket类型,同时生成socket连接对象
       conn.connect(("127.0.0.1", 6969))
       conn.send(b"Hello.World!")              #只能发bytes类型
       data = conn.recv(1024)                  #1024 字节 = 1kb
       print(data)
       conn.close()
     
     
     案例2:
     
      服务端:
      import socket
      server = socket.socket()
      server.bind(("127.0.0.1", 6968))
      server.listen(5)                             # 监听,最多可以监听的最大链接数
      while True:
       conn, addr = server.accept()             # 等待消息
       print(conn, addr)
       while True:
        data = conn.recv(1024)
        if not data:
         print("client has lost....")
         break
        print("receive:", data.decode())
        conn.send(data.upper())
      
      server.close()
      
      
      客户端:  
      import socket
      conn = socket.socket()          # 声明socket类型,同时生成socket连接对象
      conn.connect(("127.0.0.1", 6968))
      while True:
       while True:
        msg = input(">>:").strip()
        if msg : break
       conn.send(msg.encode("utf-8"))          #只能发bytes类型(不能send空,否则就卡住)
       data = conn.recv(1024)                  #1024 字节 = 1kb
       print(data.decode())
      conn.close()
      
      
      
      
      
      import os
      import socket
      server = socket.socket()
      server.bind(("127.0.0.1", 6966))
      server.listen(5)                             # 监听,最多可以监听的最大链接数
      while True:
       conn, addr = server.accept()             # 等待消息,阻塞状态
       print(conn, addr)
       while True:
        data = conn.recv(1024)
        if not data:
         print("client has lost....")
         break 
        res = os.popen(data.decode()).read()
        conn.send(res.encode("utf-8"))
      
      server.close()
      
      
      import socket
      conn = socket.socket()          # 声明socket类型,同时生成socket连接对象
      conn.connect(("127.0.0.1", 6966))
      while True:
       while True:
        msg = input(">>:").strip()
        if msg : break
       conn.send(msg.encode("utf-8"))          #只能发bytes类型
       data = conn.recv(1024)                  #1024 字节 = 1kb
       print(data.decode())
      conn.close()
     
     
     
    简单的单机SSH:
     import socket, os
     
     server = socket.socket()
     server.bind(("127.0.0.1", 8888))
     server.listen(5)
     
     while True:
      conn, addr = server.accept()
      while True:
       client_cmd = conn.recv(1024)
       if not client_cmd:
        print("the client had lost.....")
        break
       res_cmd = os.popen(client_cmd.decode()).read().encode("utf-8")
       res_size = len(res_cmd)
       conn.send(str(res_size).encode("utf-8"))
       client_action = conn.recv(1024).decode()     #有效解决了粘包
       if client_action == "start":
        data = conn.send(res_cmd)
     
     server.close()  

     
     import socket
     
     client = socket.socket()
     client.connect(("127.0.0.1", 8888))
     while True:
      while True:
       cmd = input(">>:").strip()
       if not cmd: continue
       client.send(cmd.encode("utf-8"))
       res_size = int(client.recv(1024).decode())
       client.send("start".encode("utf-8"))
       data = ""
       while res_size > 0:
        recv_data = client.recv(1024)
        data += recv_data.decode()
        res_size -= len(recv_data)
       else:
        print(data)
  • 相关阅读:
    市场上 MLCC 226 电容现象
    什么是 PCB 的压适孔
    MLCC 电容的的 NP0 C0G 材质
    超时 CS-8610 中性笔
    压敏电阻报关相关信息
    锂电池充电的四个阶段
    FastAdmin 的 Bootstrap-Table 如何合并字段?
    从2012之殇到2013的思想极度动荡的这段人生路程….
    在页面上的输入框中即可以输入文字,又可以动态的插入图片的功能.
    由一条普通的link引用引发的无数问号,大家能回答的帮忙回答回答吧.
  • 原文地址:https://www.cnblogs.com/brace2011/p/9291581.html
Copyright © 2011-2022 走看看