Python Socket編程

因須要作一個監測TCP數據內容的小插件,學習了局域網內部的封裝好的傳輸軟件Socket:python

1、Socket的簡介以下:程序員

  網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
  創建網絡通訊鏈接至少要一對端口號(socket)。 socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員
作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,
提供了網絡通訊的能力。
2、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()

3、詳細的基本API函數:json

socket()函數

bind()函數

listen()、connect()函數

accept()函數

read()、write()等函數

close()函數

4、搭建一個廣域網的單線程數據轉發服務器api

首先編寫遠程主機上的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主機的代碼以下:socket

#-*- 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()

一、下面運行服務器端的py腳本函數

二、使用EasyTCP軟件鏈接服務器對應公網IP地址和端口學習

 

三、運行本地主機PC-Ubuntu的py腳本進行網絡鏈接

四、接下來就會看到服務器端獲取的連個客戶端的IP地址和端口

 五、開始發送數據

                 手機Mobile                                           服務器數據獲取                                            本地PC-Ubuntu數據

    

相關文章
相關標籤/搜索