Python设置Socket代理及实现远程摄像头控制的例子


Posted in Python onNovember 13, 2015

为python设置socket代理
首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-packages中.或者把这个文件复制到程序所在的目录中.
然后就可以再程序中使用socket代理来编写程序了.
下面是示例代码

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",8088)
socket.socket =socks.socksocket
import urllib2
urllib2.urlopen('http://www.baidu.com').read()

通过socket通信实现远程摄像头监控
通过python来实现摄像头监控,然后通过socket通信来将数据发送到远程服务器,这样就可以实现远程监控了.大概找了下资料,果然可以,下面贴出实现过程.
这个程序包括一个服务器和一个客户端。需要的库有 VideoCapture 和 pygame,一个用来得到摄像头的视频,一个用来显示.
服务器端,主要实现监听客户端所发送到指令,如果指令是startCam,则打开摄像头,并向客户端发送数据.

from VideoCapture import Device
import ImageDraw, sys, pygame, time
from pygame.locals import *
import socket
import time
from PIL import ImageEnhance
from threading import Thread
import traceback
import threading

 
 


# 全局变量
is_sending = False
cli_address = ('', 0)

# 主机地址和端口
host = 'localhost'
port = 10218

# 初始化UDP socket
ser_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ser_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ser_socket.bind((host, port))

# 接收线程类,用于接收客户端发送的消息
class UdpReceiver(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.thread_stop = False
        
  def run(self):
    while not self.thread_stop:
      # 声明全局变量,接收消息后更改
      global cli_address  
      global is_sending
      try:
        message, address = ser_socket.recvfrom(2048)
      except:
        traceback.print_exc()
        continue
      print message,cli_address
      cli_address = address
      if message == 'startCam':
        print 'start camera',
        is_sending = True
        ser_socket.sendto('startRcv', cli_address)        
      if message == 'quitCam':
        is_sending = False
        print 'quit camera',

  def stop(self):
    self.thread_stop = True


if __name__=='__main__':
  res = (640,480)
  
  cam = Device()
  cam.setResolution(res[0],res[1])
 
  
  brightness = 1.0
  contrast = 1.0
  shots = 0
  
  receiveThread = UdpReceiver()
  receiveThread.setDaemon(True)      # 该选项设置后使得主线程退出后子线程同时退出
  receiveThread.start()
  

  while 1:
    if is_sending: 
      camshot = ImageEnhance.Brightness(cam.getImage()).enhance(brightness)
      camshot = ImageEnhance.Contrast(camshot).enhance(contrast)
      clock = pygame.time.Clock()
      img = cam.getImage().resize((160,120))
      data = img.tostring()
      ser_socket.sendto(data, cli_address) 
      time.sleep(0.05) 
    else:
      time.sleep(1)
  receiveThread.stop()
  ser_socket.close()

客户端:
主要功能是像服务器端发送指令,然后接受服务器所发送过来的数据并通过pygame模块来显示出来.

# -*- coding: UTF-8 -*-

import socket, time
import pygame
from pygame.locals import *
from sys import exit

# 服务器地址,初始化socket
ser_address = ('localhost', 10218)
cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 设置超时
cli_socket.settimeout(5)

# 向服务器发送消息,并判断接收时是否超时,若超时则重发
while 1:
  cli_socket.sendto('startCam', ser_address)
  try:
    message, address = cli_socket.recvfrom(2048)
    if message == 'startRcv':
      print message
      break
  except socket.timeout:
    continue

cli_socket.recvfrom(65536)

# 初始化视频窗口
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption('Web Camera')
pygame.display.flip()

# 设置时间,可以用来控制帧率
clock = pygame.time.Clock()


# 主循环,显示视频信息
while 1:
  try:
    data, address = cli_socket.recvfrom(65536)
  except socket.timeout:
    continue
  camshot = pygame.image.frombuffer(data, (160,120), 'RGB')
  camshot = pygame.transform.scale(camshot, (640, 480))
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      cli_socket.sendto('quitCam', ser_address)
      cli_socket.close()
      pygame.quit()
      exit()
  screen.blit(camshot, (0,0))
  pygame.display.update() 
  clock.tick(20)

客户端就是简单地向服务器发送启动消息,接收到回复后开始进入主循环开始接收视频数据并显示。
由于UDP协议不保证信息是否成功到达,因此前面设置了个重发机制,只有当客户端收到服务器的回复后,才停止发送开启消息并进入主循环.具体见注释.
使用时将localhost改成服务器IP即可.

Python 相关文章推荐
Python 可爱的大小写
Sep 06 Python
在Python中处理XML的教程
Apr 29 Python
python操作excel的方法
Aug 16 Python
浅析python的优势和不足之处
Nov 20 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
python requests.get带header
May 05 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
Python 如何对文件目录操作
Jul 10 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
python中的None与NULL用法说明
May 25 Python
深入解析Python中的urllib2模块
Nov 13 #Python
Python下的常用下载安装工具pip的安装方法
Nov 13 #Python
Python的Flask框架的简介和安装方法
Nov 13 #Python
Python编程入门之Hello World的三种实现方式
Nov 13 #Python
python编程开发之textwrap文本样式处理技巧
Nov 13 #Python
python编程开发之日期操作实例分析
Nov 13 #Python
python编程开发之类型转换convert实例分析
Nov 13 #Python
You might like
PHP中创建并处理图象
2006/10/09 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
PHP asXML()函数讲解
2019/02/03 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
Vue组件化开发思考
2018/02/02 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
Element Input组件分析小结
2018/10/11 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
js实现表格数据搜索
2020/08/09 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
如何提高python 中for循环的效率
2020/04/15 Python
美国时尚在线:Showpo
2017/09/08 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
表演方阵解说词
2014/02/08 职场文书
学习之星事迹材料
2014/05/17 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
资金申请报告范文
2015/05/14 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
证婚人致辞精选
2015/07/28 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技