网络编程(Socket)
2015-09-28 16:28
543 查看
引言:
从2007年毕业开始一直从事.net web应用程序开发,负责冶金行业的MES系统开发,写了差不多6年左右的代码,由于工作性质是需要驻厂开发,一直出差,所以在2013年跳槽了,目前从事安防行业,管理着一个视频监控客户端软件开发团队,团队采用C++(QT)开发,对于C++(QT)我只能算了解,个人比较擅长的是对于业务的理解和与人沟通交流,争取做一个有行业知识背景和技术背景的专业人士。所以想着空闲时间继续写点代码,充充电,选择Python是因为与C++接近,语法简单,更注重学习编程的知识点。技术我看的材料是官方文档《The Python Tutorial》和《Python核心编程》,我觉得这两本书对我来说已有足够多的知识点了,另外我记得MIT公开课《计算机科学与编程导论》也是采用Python作为书写语言进行讲解的,以上可能对于菜鸟有帮助,技术大牛完全可以忽略!
Socket是网络计算机之间一种非常有用的通讯方式,特别在安防行业,音视频传输主要涉及两块数据,一个是控制信令数据(例如控制摄像机云台)、一个是音视频数据的传输(视频预览、录像回放),前者采用TCP通讯,后者采用UDP通讯,具体原因就不多讲了,标准库官方参考见《Python » Python 2.7.9 documentation » The Python Standard Library » 17. Interprocess Communication and Networking » 17.2. socket — Low-level networking interface》,以下是一个TCP通讯例子。
服务端tcpServerSocket.py代码内容:
客户端tcpClientSocket.py代码内容:
怎么把这个DEMO跑起来,我这边采用的方式是客户端程序在cmd命令行中运行,服务端程序采用Pycharm运行,采用Pycharm这个IDE主要考虑方便设置断点调试用。
在cmd命令行窗口和Pycharm的Python Console窗口中可以输入以下内容来查找当前Python解释器支持路径:
例如我本机的E:\djcode是Python解释器支持路径,此时把tcpServerSocket.py和tcpClientSocket.py这两个文件复制到E:\djcode目录下,先在Pycharm的Python Console窗口中输入以下内容:
表明TCP服务程序已启动,然后在cmd命令行中输入以下内容:
则TCP客户程序也已启动,此时则可以看到如以下信息:
此程序显示的是客户端发送服务端信息是”who are you?“,此时服务端返回“Jason Bourne”,PS:Jason Bourne是马克达蒙在谍影重重电影中饰演的角色名称,本人非常喜欢!
接着是UDP的通讯例子:
服务端udpServerSocket.py代码内容:
客户端udpClientSocket.py代码内容:
以上内容是最基础的Socket通讯例子,这里我再用SocketServer这个模块写一个TCP通讯例子。PS:SocketServer是一个标准库中一个高级别的模块,主要用于简化网络客户和服务器的实现,模块中,已经实现了一些可供使用的类,标准库官方参考见《Python » Python 2.7.9 documentation » The Python Standard Library » 20. Internet Protocols and Support » 20.17. SocketServer — A framework for network servers》。具体代码如下:
服务端tcpServerSS.py代码内容:
客户端tcpClientSS.py代码内容:
总结:在运行上述例子时,可能由于注释内容中有中文,所以需要代码抬头加上#-*- coding: UTF-8 -*-,若还提示字符有问题,则需要对.py文件在记事本模式下进行转码,转成UTF-8模式即可!
从2007年毕业开始一直从事.net web应用程序开发,负责冶金行业的MES系统开发,写了差不多6年左右的代码,由于工作性质是需要驻厂开发,一直出差,所以在2013年跳槽了,目前从事安防行业,管理着一个视频监控客户端软件开发团队,团队采用C++(QT)开发,对于C++(QT)我只能算了解,个人比较擅长的是对于业务的理解和与人沟通交流,争取做一个有行业知识背景和技术背景的专业人士。所以想着空闲时间继续写点代码,充充电,选择Python是因为与C++接近,语法简单,更注重学习编程的知识点。技术我看的材料是官方文档《The Python Tutorial》和《Python核心编程》,我觉得这两本书对我来说已有足够多的知识点了,另外我记得MIT公开课《计算机科学与编程导论》也是采用Python作为书写语言进行讲解的,以上可能对于菜鸟有帮助,技术大牛完全可以忽略!
Socket是网络计算机之间一种非常有用的通讯方式,特别在安防行业,音视频传输主要涉及两块数据,一个是控制信令数据(例如控制摄像机云台)、一个是音视频数据的传输(视频预览、录像回放),前者采用TCP通讯,后者采用UDP通讯,具体原因就不多讲了,标准库官方参考见《Python » Python 2.7.9 documentation » The Python Standard Library » 17. Interprocess Communication and Networking » 17.2. socket — Low-level networking interface》,以下是一个TCP通讯例子。
服务端tcpServerSocket.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- # TCP服务端 from socket import * reply = 'Jason Bourne' # 创建一个基于网络TCP/IP的socket,AF_INEF代表基于网络的,SOCK_STREAM代表面向连接的,即TCP/IP tcpSerSocket = socket(AF_INET, SOCK_STREAM) # 绑定地址(主机,端口号对)到socket tcpSerSocket.bind(('',21567)) # 该server支持最多3个client的连接 tcpSerSocket.listen(3) # 被动接受client的连接,accept()返回一个元祖,client对象、IP地址和端口号 tcpCliSocket,addr = tcpSerSocket.accept() # 接收client发送过来的数据 request = tcpCliSocket.recv(1024) # 完整发送server要返回的数据 tcpCliSocket.sendall(reply) print 'Connected by {0}'.format(addr) print 'request is:{0}'.format(request) # 关闭连接 tcpSerSocket.close()
客户端tcpClientSocket.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- # TCP客户端 from socket import * request = 'who are you?' # 创建一个基于网络TCP/IP的socket,AF_INEF代表基于网络的,SOCK_STREAM代表面向连接的,即TCP/IP tcpCliSocket = socket(AF_INET, SOCK_STREAM) # 主动初始化连接TCP服务器 tcpCliSocket.connect(('127.0.0.1', 21567)) # 向server完整发送TCP数据 tcpCliSocket.sendall(request) # 接收server返回的数据 reply = tcpCliSocket.recv(1024) print 'reply is:{0}'.format(reply) # 关闭连接 tcpCliSocket.close()
怎么把这个DEMO跑起来,我这边采用的方式是客户端程序在cmd命令行中运行,服务端程序采用Pycharm运行,采用Pycharm这个IDE主要考虑方便设置断点调试用。
在cmd命令行窗口和Pycharm的Python Console窗口中可以输入以下内容来查找当前Python解释器支持路径:
>>>import sys >>>print sys.path
例如我本机的E:\djcode是Python解释器支持路径,此时把tcpServerSocket.py和tcpClientSocket.py这两个文件复制到E:\djcode目录下,先在Pycharm的Python Console窗口中输入以下内容:
>>>import tcpServerSocket
表明TCP服务程序已启动,然后在cmd命令行中输入以下内容:
>>>import tcpClientSocket
则TCP客户程序也已启动,此时则可以看到如以下信息:
此程序显示的是客户端发送服务端信息是”who are you?“,此时服务端返回“Jason Bourne”,PS:Jason Bourne是马克达蒙在谍影重重电影中饰演的角色名称,本人非常喜欢!
接着是UDP的通讯例子:
服务端udpServerSocket.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- # UDP服务端 from socket import * reply = 'Jason Bourne' # 创建一个基于网络UDP/IP的socket,AF_INEF代表基于网络的,SOCK_DGRAM代表面向无连接的,即UDP/IP udpSerSocket = socket(AF_INET,SOCK_DGRAM) # 绑定地址(主机,端口号对)到socket udpSerSocket.bind(('',21568)) # 接收client发送过来的数据 request,addr = udpSerSocket.recvfrom(1024) print 'Connected by {0}'.format(addr) print 'request is:{0} '.format(request) # 关闭连接 udpSerSocket.close()
客户端udpClientSocket.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- from socket import * request = 'who are you?' # 创建一个基于网络UDP/IP的socket,AF_INEF代表基于网络的,SOCK_DGRAM代表面向无连接的,即UDP/IP udpCliSocket = socket(AF_INET,SOCK_DGRAM) # 向IP:127.0.0.1,端口:21566的服务端发送UDP数据 udpCliSocket.sendto(request,('127.0.0.1',21568)) # 接收server返回的UDP数据 reply = udpCliSocket.recvfrom(1024) udpCliSocket.close()
以上内容是最基础的Socket通讯例子,这里我再用SocketServer这个模块写一个TCP通讯例子。PS:SocketServer是一个标准库中一个高级别的模块,主要用于简化网络客户和服务器的实现,模块中,已经实现了一些可供使用的类,标准库官方参考见《Python » Python 2.7.9 documentation » The Python Standard Library » 20. Internet Protocols and Support » 20.17. SocketServer — A framework for network servers》。具体代码如下:
服务端tcpServerSS.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- # 创建一个SocketServerTCP服务器 from SocketServer import TCPServer as TCP,StreamRequestHandler as SRH reply = 'Jason Bourne' # 从SocketServer的StreamRequestHandler类中派生MyRequestHandler子类,并重写handle()函数 class MyRequestHandler(SRH): def handle(self): # 接收客户端地址信息 print 'Connected by {0}'.format(self.client_address) # 接收客户端发送的数据 print 'request is:{0}'.format(self.request.recv(1024)) # 发送服务端返回数据 self.wfile.write(reply) # 通过给定的主机信息和请求处理类来创建TCP服务器 tcpServ = TCP(('',21569),MyRequestHandler) print 'waiting for connection...' tcpServ.serve_forever()
客户端tcpClientSS.py代码内容:
__author__ = 'xiaojj' #-*- coding: UTF-8 -*- # 创建一个SocketServerTCP客户端 from socket import * request = 'who are you?' # 创建一个基于网络TCP/IP的socket,AF_INEF代表基于网络的,SOCK_STREAM代表面向连接的,即TCP/IP tcpCliSocket = socket(AF_INET, SOCK_STREAM) # 主动初始化连接TCP服务器 tcpCliSocket.connect(('127.0.0.1', 21569)) # 向server完整发送TCP数据 tcpCliSocket.sendall(request) # 接收server返回的数据 reply = tcpCliSocket.recv(1024) print 'reply is:{0}'.format(reply) # 关闭连接 tcpCliSocket.close()
总结:在运行上述例子时,可能由于注释内容中有中文,所以需要代码抬头加上#-*- coding: UTF-8 -*-,若还提示字符有问题,则需要对.py文件在记事本模式下进行转码,转成UTF-8模式即可!
相关文章推荐
- spring mvc获取request HttpServletRequest
- spring mvc获取request HttpServletRequest
- HttpClient
- http 表单加密。
- TCP和UDP的区别
- 网络请求在Genymotion中成功,真机中失败
- Http协议与TCP协议简单理解
- 高性能的开源HTTP加速器varnish
- Http服务器实现文件上传与下载(三)
- 跨域访问http接口的使用
- 如何计算网络地址和广播地址
- AWS EC2服务器的HTTPS负载均衡器配置过程
- AWS EC2服务器的HTTPS负载均衡器配置过程
- C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
- 安卓:启动service,下载网络图片,并将图片存放到内存卡,保存成功后发出广播提醒,然后从SD卡读出显示
- TCP/IP详解卷1 读书笔记:第一章 概述
- httpd属性配置
- subversion各个旧版本下载地址:http://archive.apache.org/dist/subversion/
- HttpServletRequestWrapper重新并修改http请求信息
- 《SDN软件定义网络从入门到精通》理论课