最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)簡單的TCP代理服務(wù)器

 更新時間:2014年10月08日 09:57:44   投稿:shichen2014  
這篇文章主要介紹了python實現(xiàn)簡單的TCP代理服務(wù)器,包含了完整的實現(xiàn)過程及對應(yīng)的源碼與說明文檔下載,非常具有參考借鑒價值,需要的朋友可以參考下

本文實例講述了python實現(xiàn)簡單的TCP代理服務(wù)器的方法,分享給大家供大家參考。

具體實現(xiàn)代碼如下:

# -*- coding: utf-8 -*-

'''
filename:rtcp.py
@desc:
利用python的socket端口轉(zhuǎn)發(fā),用于遠(yuǎn)程維護(hù)
如果連接不到遠(yuǎn)程,會sleep 36s,最多嘗試200(即兩小時)

@usage:
./rtcp.py stream1 stream2
stream為:l:port或c:host:port
l:port表示監(jiān)聽指定的本地端口
c:host:port表示監(jiān)聽遠(yuǎn)程指定的端口

@author: watercloud, zd, knownsec team
@web: www.knownsec.com, blog.knownsec.com
@date: 2009-7
'''

import socket
import sys
import threading
import time

streams = [None, None] # 存放需要進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)的兩個數(shù)據(jù)流(都是SocketObj對象)
debug = 1 # 調(diào)試狀態(tài) 0 or 1

def _usage():
 print 'Usage: ./rtcp.py stream1 stream2\nstream : l:port or c:host:port'

def _get_another_stream(num):
 '''
 從streams獲取另外一個流對象,如果當(dāng)前為空,則等待
 '''
 if num == 0:
 num = 1
 elif num == 1:
 num = 0
 else:
 raise "ERROR"

 while True:
 if streams[num] == 'quit':
  print("can't connect to the target, quit now!")
  sys.exit(1)

 if streams[num] != None:
  return streams[num]
 else:
  time.sleep(1)

def _xstream(num, s1, s2):
 '''
 交換兩個流的數(shù)據(jù)
 num為當(dāng)前流編號,主要用于調(diào)試目的,區(qū)分兩個回路狀態(tài)用。
 '''
 try:
 while True:
  #注意,recv函數(shù)會阻塞,直到對端完全關(guān)閉(close后還需要一定時間才能關(guān)閉,最快關(guān)閉方法是shutdow)
  buff = s1.recv(1024)
  if debug > 0:
  print num,"recv"
  if len(buff) == 0: #對端關(guān)閉連接,讀不到數(shù)據(jù)
  print num,"one closed"
  break
  s2.sendall(buff)
  if debug > 0:
  print num,"sendall"
 except :
 print num,"one connect closed."

 try:
 s1.shutdown(socket.SHUT_RDWR)
 s1.close()
 except:
 pass

 try:
 s2.shutdown(socket.SHUT_RDWR)
 s2.close()
 except:
 pass

 streams[0] = None
 streams[1] = None
 print num, "CLOSED"

def _server(port, num):
 '''
 處理服務(wù)情況,num為流編號(第0號還是第1號)
 '''
 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 srv.bind(('0.0.0.0', port))
 srv.listen(1)
 while True:
 conn, addr = srv.accept()
 print "connected from:", addr
 streams[num] = conn # 放入本端流對象
 s2 = _get_another_stream(num) # 獲取另一端流對象
 _xstream(num, conn, s2)

def _connect(host, port, num):
 ''' 處理連接,num為流編號(第0號還是第1號)

 @note: 如果連接不到遠(yuǎn)程,會sleep 36s,最多嘗試200(即兩小時)
 '''
 not_connet_time = 0
 wait_time = 36
 try_cnt = 199
 while True:
 if not_connet_time > try_cnt:
  streams[num] = 'quit'
  print('not connected')
  return None

 conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 try:
  conn.connect((host, port))
 except Exception, e:
  print ('can not connect %s:%s!' % (host, port))
  not_connet_time += 1
  time.sleep(wait_time)
  continue

 print "connected to %s:%i" % (host, port)
 streams[num] = conn #放入本端流對象
 s2 = _get_another_stream(num) #獲取另一端流對象
 _xstream(num, conn, s2)


if __name__ == '__main__':
 if len(sys.argv) != 3:
 _usage()
 sys.exit(1)
 tlist = [] # 線程列表,最終存放兩個線程對象
 targv = [sys.argv[1], sys.argv[2] ]
 for i in [0, 1]:
 s = targv[i] # stream描述 c:ip:port 或 l:port
 sl = s.split(':')
 if len(sl) == 2 and (sl[0] == 'l' or sl[0] == 'L'): # l:port
  t = threading.Thread(target=_server, args=(int(sl[1]), i))
  tlist.append(t)
 elif len(sl) == 3 and (sl[0] == 'c' or sl[0] == 'C'): # c:host:port
  t = threading.Thread(target=_connect, args=(sl[1], int(sl[2]), i))
  tlist.append(t)
 else:
  _usage()
  sys.exit(1)

 for t in tlist:
 t.start()
 for t in tlist:
 t.join()
 sys.exit(0)

完整實例代碼點擊此處本站下載

希望本文所述對大家的Python程序設(shè)計有所幫助。

相關(guān)文章

  • python中類的一些方法分析

    python中類的一些方法分析

    這篇文章主要介紹了python中類的一些方法分析,實例講述了Python中子類調(diào)用父類時繼承的方法問題,需要的朋友可以參考下
    2014-09-09
  • Python使用內(nèi)存緩存實例分享

    Python使用內(nèi)存緩存實例分享

    Python中的內(nèi)存緩存是一種將計算結(jié)果存儲在內(nèi)存中,以便在后續(xù)調(diào)用時快速獲取結(jié)果的技術(shù)。通過使用裝飾器和字典等數(shù)據(jù)結(jié)構(gòu),可以輕松實現(xiàn)內(nèi)存緩存功能,提高程序的執(zhí)行效率。
    2023-09-09
  • PyTorch中apex安裝方式和避免踩坑

    PyTorch中apex安裝方式和避免踩坑

    本文主要介紹了PyTorch中apex安裝方式和避免踩坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python編寫函數(shù)注意事項總結(jié)

    python編寫函數(shù)注意事項總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于python編寫函數(shù)注意事項總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • python如何變換環(huán)境

    python如何變換環(huán)境

    在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于python如何變換環(huán)境的相關(guān)基礎(chǔ)文章,有需要的朋友們可以參考下。
    2020-07-07
  • python如何實現(xiàn)lazy segment tree惰性段樹算法

    python如何實現(xiàn)lazy segment tree惰性段樹算法

    LazySegmentTree(惰性段樹)算法是一種數(shù)據(jù)結(jié)構(gòu),專門用于高效處理區(qū)間查詢和更新操作,它利用延遲更新技術(shù)(LazyPropagation),僅在必要時執(zhí)行實際更新,以提升效率,此結(jié)構(gòu)將數(shù)組表達(dá)為二叉樹,每個節(jié)點表示一個數(shù)組區(qū)間
    2024-10-10
  • Python實戰(zhàn)小程序利用matplotlib模塊畫圖代碼分享

    Python實戰(zhàn)小程序利用matplotlib模塊畫圖代碼分享

    這篇文章主要介紹了Python實戰(zhàn)小程序利用matplotlib模塊畫圖代碼分享,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • python字符串操作

    python字符串操作

    這篇文章主要介紹了python字符串操作,主要包括字符串的分割、字符串的查找,替換、字符串的判斷,下面一起進(jìn)入文章了解具體內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • python中的異步爬蟲詳解

    python中的異步爬蟲詳解

    這篇文章主要介紹了python中的異步爬蟲詳解,所謂的異步異步?IO,就是發(fā)起一個?IO?阻塞的操作,但是不用等到它結(jié)束,可以在它執(zhí)行?IO?的過程中繼續(xù)做別的事情,當(dāng)?IO?執(zhí)行完畢之后會收到它的通知,需要的朋友可以參考下
    2023-08-08
  • Python 處理數(shù)據(jù)庫事務(wù)的操作方法

    Python 處理數(shù)據(jù)庫事務(wù)的操作方法

    在Python中,處理數(shù)據(jù)庫事務(wù)通常涉及使用特定的數(shù)據(jù)庫驅(qū)動如sqlite3、PyMySQL和psycopg2等,這些庫提供事務(wù)管理功能,允許開發(fā)者手動控制事務(wù)的提交和回滾,本文給大家介紹Python如何處理數(shù)據(jù)庫事務(wù),感興趣的朋友一起看看吧
    2024-10-10

最新評論

湖南省| 麻栗坡县| 丽水市| 连州市| 紫金县| 黄浦区| 汤原县| 平潭县| 穆棱市| 徐汇区| 济南市| 基隆市| 西吉县| 武山县| 大宁县| 祁门县| 卢湾区| 泸水县| 普兰店市| 兴文县| 合川市| 上思县| 凯里市| 通河县| 望都县| 宁强县| 东明县| 黄山市| 佛冈县| 静宁县| 天祝| 大竹县| 丹江口市| 巍山| 潼南县| 泊头市| 济南市| 周口市| 策勒县| 安国市| 镇江市|