zoukankan      html  css  js  c++  java
  • Python学习——socket 模块

    http://www.cnblogs.com/alex3714/articles/5830365.html 可以看的内容

    socket ssh (不带防止粘包的方法)

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author Ian Ying
    # mail: kongqing.ying@yitu-inc.com
    
    import socket
    import os
    
    server = socket.socket()
    server.bind(('localhost', 6969))  #绑定被监听端口
    server.listen(5)   #监听端口
    while True:
        print("我要开始等电话了")
        conn, addr = server.accept()  # 就是等待的意思
        #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
        print("电话来了%s"% [conn, addr])
        while True:
            data = conn.recv(1024)
            if not data:
                print('client is lost.')
                break
            # res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
            # with open('filename', 'r') as ret:  #这两行就 可以用过来传输文件了。
            #     data = ret.read()
            print('receive:',data)
            conn.send(data.upper())
    
    
    server.close()

    socket client 模块

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author Ian Ying
    # mail: kongqing.ying@yitu-inc.com
    
    import socket
    
    
    client = socket.socket() #声明socket类型,同时生成socket链接对象
    client.connect(('localhost',6969))   #localhost就是本机地址
    
    while True:
        msg = input('input msg >>:').strip()
        if len(msg) == 0: continue  #检查msg的信息,防止无输入信息
        #client.send(b"Hello, world!") #发送信息
        client.send(msg.encode('utf-8'))
    
        data = client.recv(1024) #默认接受1024字节,就是1k
        # with open('filename', 'w') as ret:  # 这两行就 可以用过来传输文件了。
        #     ret = data.write()
    
        print(data.decode())
    
    client.close() #关闭端口

    防止粘包的socket_ssh.py

     1 #! /usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author Ian Ying
     4 # mail: kongqing.ying@yitu-inc.com
     5 
     6 import socket
     7 import os
     8 
     9 server = socket.socket()
    10 server.bind(('localhost', 6969))  #绑定被监听端口
    11 server.listen(5)   #监听端口
    12 while True:
    13     print("我要开始等电话了")
    14     conn, addr = server.accept()  # 就是等待的意思
    15     #conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
    16 
    17     while True:
    18         data = conn.recv(1024).decode()
    19         print("电话来了%s" % type(data))
    20         # if type(data) is str:
    21         #     data = data.strip()
    22         if not data:
    23             print('client is lost.')
    24             break
    25         cmd_res = os.popen(data).read() #popen就是打开命令执行,read就是获取结果
    26         cmd_res_size = str(len(cmd_res.encode("utf-8")))
    27         print("before send",len(cmd_res),"size after encode", cmd_res_size)
    28         if len(cmd_res) == 0:
    29             print("there is no output.")
    30             res_warning = "there is no output."
    31             conn.send(res_warning.encode("utf-8"))
    32             continue
    33         else:
    34             conn.send(cmd_res_size.encode("utf8"))
    35             print(conn.recv(1024).decode())  #通过接收数据的形式来强制发送缓冲区的数据,防止粘包。
    36         # with open('filename', 'r') as ret:  #这两行就 可以用过来传输文件了。
    37         #     data = ret.read()
    38         #print('receive:',data)
    39         print('receive:', data)
    40         conn.send(cmd_res.encode("utf-8"))
    41         # conn.send(bytes(cmd_res)) #不可行。传输的时候是需要encoding
    42 
    43 
    44 server.close()

    socket_client.py

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author Ian Ying
    # mail: kongqing.ying@yitu-inc.com
    
    import socket
    
    
    client = socket.socket() #声明socket类型,同时生成socket链接对象
    client.connect(('localhost',6969))   #localhost就是本机地址
    
    while True:
        msg = input('input msg >>:').strip()
        if len(msg) == 0: continue  #检查msg的信息,防止无输入信息
        #client.send(b"Hello, world!") #发送信息
        client.send(msg.encode('utf-8'))
        received_size = client.recv(1024).decode() #用来记录接受的数据大小
        print("接收的数据大小", received_size)
        received_cont = b''
        received_cont_size = 0  # 用来判断接受数据的大小
        if received_size != "there is no output." :
            client.send("准备好了,可以发送。".encode())  #发送确认信息,以防止粘包
            received_size = int(received_size) #数据需要变成int才能进行判断
            while received_size != received_cont_size:  #判断encode后的长度是否一致。
                received_cont_for_test = client.recv(1024)
                received_cont_size += int(len(received_cont_for_test))
                received_cont = received_cont + received_cont_for_test
                print("当前结束后的数据大小为:", received_cont_size)
                # print(received_cont_size)
            else:
                print("数据接收完成,接收的数据大小为:", received_cont_size)
                print("接收的内容为:
    ",received_cont.decode(),"
    ")
        else:
            print("output:
    ", received_size)
    
    
            # data = client.recv(1024) #默认接受1024字节,就是1k
            # with open('filename', 'w') as ret:  # 这两行就 可以用过来传输文件了。
            #     ret = data.write()
            # print(data.decode())
            # print(str(data))
    
    
    client.close() #关闭端口
  • 相关阅读:
    java面试-Java内存模型(JMM)
    github常用操作
    java面试-生产环境服务器变慢,谈谈你的诊断思路
    java面试-JVM调优和参数配置,如何查看JVM系统参数默认值
    java面试-死锁产生、定位分析和修复
    Scalable IO in Java【java高效IO】
    java面试-JDK自带的JVM 监控和性能分析工具用过哪些?
    Docker简介
    使用docker部署项目
    公司系统遇到的问题,虽然解决了,但是,不知道原因。贴下图片,供下次参考
  • 原文地址:https://www.cnblogs.com/Ian-learning/p/8454597.html
Copyright © 2011-2022 走看看