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中使用poplib模块收取邮件的教程
Apr 29 Python
Django中的文件的上传的几种方式
Jul 23 Python
Python爬取qq空间说说的实例代码
Aug 17 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
python使用自定义钉钉机器人的示例代码
Jun 24 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
python-for x in range的用法(注意要点、细节)
May 10 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
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
PHP 危险函数解释 分析
2009/04/22 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
python修改字典内key对应值的方法
2015/07/11 Python
解读python logging模块的使用方法
2018/04/17 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
在Python中使用Neo4j的方法
2019/03/14 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
寝室长工作失责检讨书
2014/10/06 职场文书
投标单位介绍信
2015/05/05 职场文书
oracle重置序列从0开始递增1
2022/02/28 Oracle
springboot读取nacos配置文件
2022/05/20 Java/Android