因需要做一個監測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數據