• Python Socket编程


    因需要做一个监测TCP数据内容的小插件,学习了局域网内部的封装好的传输软件Socket:

    一、Socket的简介如下:

      网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
      建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员
    做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,
    提供了网络通信的能力。
    二、Socket的操作流程如下:
    如上图所示:TCP客户端和TCP服务器端都需要进行上述的步骤
    TCP服务端的配置步骤:
    Step1:建立Socket对象   Sk = socket.socket()
    Step2:把一个地址族中的特定地址赋给socket  Sk.bind((host,port))
    Step3:开启监听进程等待客户端链接服务端  Sk.listen(1)
    Step4:接受客户端的申请,获取客户端的IP地址及其端口PORT  clnt, addr = Sk.accept()
    Step5:建立好连接之后,等待接受客户端的数据  data = clnt.recv(1024)
    Step6:应答客户机的请求,将对应的数据发回去  clnt.sendall(data)
    Step7:关闭socket对象 Sk.close()
     
    TCP客户端的配置步骤:
    Step1:建立Socket对象   S = socket.socket()
    Step2:把连接客户端到对应的服务端  S.connect((host, port))
    Step3:连接成功后向服务端发送数据  S.sendall(cmd)
    Step4:接等待服务端的回应数据  data = S.recv(1024)
    Step5:关闭socket对象 Sk.close()
     
    程序如下(主机端+客户端):
    # -*- coding:utf-8 -*-
    import socket
    import urllib
    import json
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-+8')
    RoBot_Key = 'd4490d8bf55442b4871cfecd4defb68'  #这个Key可以从图灵机器人官网注册获得
    RoBot_Add = 'http://www.tuling123.com/openapi/api?key='
    def Communicate(info):
        url = RoBot_Add+RoBot_Key+'&info='+info
        response = urllib.urlopen(url).read()
        data = json.loads(response)
        return u'机器人:'.decode('utf-8')+data['text']
    host = '192.168.1.120'
    print host
    port = 5000
    Sk = socket.socket()
    Sk.bind((host, port))
    Sk.listen(1)
    while True:
        clnt, addr = Sk.accept()
        print 'Address is:', addr
        while True:
            data = clnt.recv(1024)
            if not data:
                clnt, addr = Sk.accept()
            print 'Going to:', data
            result = Communicate(data)
            if len(result) == 0:
                result = 'EXD'
            clnt.sendall(result)
    Sk.close()

    客户端:

    # -*- uft-8 -*-
    import socket
    S = socket.socket()
    host = '192.168.1.120'
    port = 5000
    S.connect((host, port))
    while True:
        cmd = raw_input('Please enter your cmd:')
        if cmd == '':
            continue
        print 'Sending Command!'
        S.sendall(cmd)
        data = S.recv(1024)
        print data
    S.close()

    三、详细的基本API函数:

    socket()函数

    bind()函数

    listen()、connect()函数

    accept()函数

    read()、write()等函数

    close()函数

    四、搭建一个广域网的单线程数据转发服务器

    首先编写远程主机上的py代码,主机是申请的腾讯云的主机,安装好python,公网IP地址是119.29.3.xxx  内网IP地址是10.135.24.xxx

    服务器代码如下:

    # -*- coding:utf-8-*-
    import socket
    sk_Client0 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sk_Client1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    host0 = '10.135.24.xxx' # socket.gethostbyname(socket.gethostname())
    port0 = 5000
    sk_Client0.bind((host0,port0))
    sk_Client0.listen(1)
    
    host1 = '10.135.24.xxx' # socket.gethostbyname(socket.gethostname())
    port1 = 5001
    sk_Client1.bind((host1,port1))
    sk_Client1.listen(1)
    
    while 1:
      clnt0,addr0 = sk_Client0.accept()
      clnt1,addr1 = sk_Client1.accept()
      print 'clint0-Mobile address:',addr0
      print 'clint1-Ubuntu address:',addr1
      while True:
        data0 = clnt0.recv(10)
        print data0
        if not data0:
          # sys.exit()
          clnt0,addr0 = sk_Client0.accept()
        print 'going to run cmd:',data0
        clnt0.sendall(data0)
        clnt1.sendall(data0)
    clnt0.close()
    clnt1.close()

    本地PC-Ubuntu主机的代码如下:

    #-*- coding:utf-8 -*-
    import socket
    S = socket.socket()
    Server_host = '119.29.3.xxx'
    Server_port = 5001
    
    S.connect((Server_host,Server_port))
    while 1:
        data = S.recv(1024)
        print data
    S.close()

    1、下面运行服务器端的py脚本

    2、使用EasyTCP软件连接服务器对应公网IP地址和端口

     

    3、运行本地主机PC-Ubuntu的py脚本进行网络连接

    4、接下来就会看到服务器端获取的连个客户端的IP地址和端口

     5、开始发送数据

                     手机Mobile                                           服务器数据获取                                            本地PC-Ubuntu数据

        

  • 相关阅读:
    从头到尾彻底理解KMP
    [CF1220E] Tourism
    [CF446C] DZY Loves Fibonacci Numbers
    [CF1003E] Tree Constructing
    [CF1238E] Keyboard Purchase
    [CF915E] Physical Education Lessons
    [CF788B] Weird journey
    [CF1371E2] Asterism (Hard Version)
    [CF780E] Underground Lab
    [CF372C] Watching Fireworks is Fun
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/7296083.html
Copyright © 2020-2023  润新知