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)
posted on 2018-07-10 21:33  仙寓游子  阅读(128)  评论(0编辑  收藏  举报