网络编程(Socket)
引言:
从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模式即可!
网络编程(Socket)的更多相关文章
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- 网络编程Socket之TCP之close/shutdown具体解释(续)
接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...
- 铁乐学Python_Day33_网络编程Socket模块1
铁乐学Python_Day33_网络编程Socket模块1 部份内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 理解socket Socket是应用层与TCP/IP协 ...
- Python网络编程socket
网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- linux网络编程-socket(37)
在编程的时候需要加上对应pthread开头的头文件,gcc编译的时候需要加了-lpthread选项 第三个参数是线程的入口参数,函数的参数是void*,返回值是void*,第四个参数传递给线程函数的参 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Python开发【第八篇】:网络编程 Socket
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- python网络编程socket /socketserver
提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...
随机推荐
- Centos中使用Jenkins执行gulp命令:command not found
在Centos操作系统,使用Jenkins的pipeline执行发布流程:jenkinsfile如下: stage("前端项目构架gulp") { steps { dir('src ...
- 一个带展示的jsp上传控件模型
带展示上传控件的基本模型,无样式 jsp部分: <td> <form id="form1" enctype="multipart/form-data&q ...
- ctci1.3
; i < len; i++){ if(str0[i] != str1[i]) return false; } return t ...
- @DataProvider的应用
代码中经常有一些数据需要维护,但是每次都写在一个class或者methods中,维护起来是个麻烦事: 这里引入@DataProvider的思想,建一个DataProvider的方法,让我们需要维护的数 ...
- 【Demo】jQuery 表格内容动态排序
实现功能: 通过点击表头某个字段,实现内容的升序或降序排序. 效果如下: 完整代码: <!DOCTYPE html> <html> <head> <meta ...
- bzoj 1798 双标记区间修改线段树
#include<bits/stdc++.h> using namespace std; #define MAXN 100000 #define M ((L+R)>>1) #d ...
- 变更Linux下的Java版本 alternatives
默认正常情况下,即使使用Java 1.6版本Java脚本jdk-6u31-linux-i586.bin,安装Java运行后,会出现自动升级为1.7版本状态的情况.针对某些应用程序需要基于1.6版本方可 ...
- 图片服务器(FastDFS)的搭建
1.1 什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用Fa ...
- python:控制鼠标和键盘
程序: # # _*_ coding:UTF-8 _*_ import win32api import win32con import win32gui from ctypes import * im ...
- (转载) jQuery页面加载初始化的3种方法
jQuery 页面加载初始化的方法有3种 ,页面在加载的时候都会执行脚本,应该没什么区别,主要看习惯吧,本人觉得第二种方法最好,比较简洁. 第一种: $(document).ready(functio ...