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的web.py框架并从hello world开始编程
Apr 25 Python
Python处理字符串之isspace()方法的使用
May 19 Python
python装饰器初探(推荐)
Jul 21 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
分析python请求数据
Aug 19 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Python 实现一个计时器
Jul 28 Python
python实现的web监控系统
Apr 27 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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 生成文字png图片的代码
2011/04/17 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
JavaScript 数组详解
2013/10/10 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python获取目录下所有文件的方法
2015/06/01 Python
对Python 语音识别框架详解
2018/12/24 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
Python如何实现机器人聊天
2020/09/10 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
2014年元旦促销活动方案
2014/02/22 职场文书
学习退步检讨书
2014/09/28 职场文书
2014年保卫工作总结
2014/12/05 职场文书
世界环境日活动总结
2015/02/11 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
MySQL中in和exists区别详解
2021/06/03 MySQL