什么是socket  

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

  Socket的英文原义是“孔”或“插座”。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

  我知道上面那段话很枯燥,那就忘记吧!我们只需要记得:两个程序通过“网络”交互数据就使用socket,它只负责两件事:建立连接,传递数据。不能再简练了!!!

如何执行一段socket代码?

  首先,我们先看下面这个例子,什么都不需要懂,我们只知道这么写就可以实现一个socket,让两个程序互相传递消息:

  server:     client:        

  先说一下它们是怎么跑起来的,新建两个python文件:socket_server.py,socket_client.py 分别将demo1_server Code和demo1_client Code中的代码粘到对应的文件中,先执行socket_server.py,再执行socket_client.py,就可以看到效果啦!代码拿去,先体验一下socket的效果。

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Eva_J'
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1',8001))
sock.listen(5) while True:
print 'waiting....'
connection, address = sock.accept()
receive = connection.recv(1024)
print 'receive the message from client:',receive
connection.send("received")
connection.close()

demo1_server Code

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Eva_J'
import socket obj_client = socket.socket()
obj_client.connect(('127.0.0.1',8001))
obj_client.send('help')
server_data = obj_client.recv(1024)
print server_data
obj_client.close()

demo1_client Code

一分钟拥有一个自己的socket程序!

  执行成功了么?我们先不解释原理,一切以能把socket用起来为前提,把上面这段代码当做实现socket的模板代码,来看看哪些东西是我们可以替换的,先拼凑一个属于自己的socket程序。

  server:        client:

                          

  我们先从打印出来的内容来看,server端接收到了从client端发送过来的信息 'help' 。并且给client端发送了一条确认信息 'received',我们在client端接收到了这条信息。这就是数据交互的过程。send是发消息方法,recv是接收消息方法。我们只需要修改send和recv中的内容,就可以实现两个程序的数据交互了。

  socket的实现就像是快递员取快递的过程,寄出包裹的是server端,快递员是client端,send和recv中的内容就是我们要寄出的东西,那么准备好了要寄出的东西,我们要告诉快递员到哪里来取件,看server中的sock.bind方法,这里面传了一个元组('ip','port')给bind方法,就是把包裹放在这个地址的这个端口等待快递员;而client端的obj_client.connect方法是告诉快递员,去那个地址找这个端口去取包裹。所以这个元组中的ip和port内容必须一致,是我和快递员约好的。我send的内容无所谓是什么,我send什么,客户端就recv什么,因为我要寄什么,快递员拿到的就是什么,他没有权利左右我寄什么东西。现在就行动起来,把要寄的东西和放东西的地址换成你自己的,来get一个属于自己的socket程序吧。

socket程序代码详解:

  server:     client:

 创建socket对象——参数详解:

                                     

  参数一:地址簇

    socket.AF_INET IPv4(默认)
    socket.AF_INET6 IPv6

    socket.AF_UNIX 只能够用于单一的Unix系统进程间通信

  参数二:类型

    socket.SOCK_STREAM  流式socket , for TCP (默认)
    socket.SOCK_DGRAM   数据报式socket , for UDP

    socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利  用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
    socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
    socket.SOCK_SEQPACKET 可靠的连续数据包服务

  参数三:协议(这个参数用默认的就好,所以在我们创建对象的时候没有使用此参数,忘记这个参数吧)

    0  (默认)与特定的地址家族相关的协议,如果是 0 ,则系统就会根据地址格式和套接类别,自动选择一个合适的协议'

UDP协议实现socket代码实例:

  我们刚刚看的例子中都是使用TCP协议进行传输,下面上一段UDP的例子。

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',9999) sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
while True:
inp = raw_input('数据:').strip()
if inp == 'exit':
break
sk.sendto(inp,ip_port)
sk.close()

UDP Server Code

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',9999)
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
sk.bind(ip_port) while True:
data = sk.recv(1024)
print data

UDP Client Code

参考:

socket详解:http://www.cnblogs.com/wupeiqi/articles/5040823.html

TCP和UDP协议的区别:http://jingyan.baidu.com/article/6dad5075df3452a123e36ecb.html

python——初识socket的更多相关文章

  1. day9学python 类+异常处理+初识socket

    类+异常处理+初识socket 类的特点: 1.封装-同其他语言 2.继承 py2 经典类深度优先 新式类类名(object)广度优先py3 都是广度优先 3.多态-python本身无多态 可用方法调 ...

  2. python 网络内容: 初识socket

    一 C\S架构,客户端服务端架构 客户端(client) : 享受服务端提供的服务 服务端(server) : 给客户端提供服务 B\S 浏览器和服务端 B(browser) 二 网络通信的整个流程( ...

  3. python学习之路---day25( 网络编程基础和初识socket)

    基本网络知识和初识socket一:基本知识 网线:传输电信号 集线器:将所有连接到集线器的网络设备连通起来 交换机: 升级版的集线器 网卡:接受电信号 MAC地址:物理地址: 8C-88-4B-88- ...

  4. python之socket

    一.初识socket      socket 是网络连接端点,每个socket都被绑定到一个特定的IP地址和端口.IP地址是一个由4个数组成的序列,这4个数均是范围 0~255中的值(例如,     ...

  5. Python 入门【一】Python 初识及学习资料

    Python 初识及学习路线: CodeCademy Python 在线教学: 廖雪峰 Python 2.7 教程: 廖雪峰 Python 3.0 教程: Python 官方文档(2.7~3.7:英文 ...

  6. 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)

    Python的socket高级应用(多进程,协程与异步)

  7. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  8. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  9. Python Udp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

随机推荐

  1. ERROR 1010 (HY000): Error dropping database (can't rmdir '.\qpweb', errno: 41) 删库失败问题的解决

    Win8 下,MySQL5.5,root 用户登录 MySQL 5.5 Command Line Client,删除 qpweb 数据,执行命令 drop database qpweb;报错信息:ER ...

  2. RDIFramework.NET Web版介绍

    RDIFramework.NET  Web版介绍 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了 ...

  3. UE4中使用数据表(Data Table)

    本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中 ...

  4. Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)

    控制台程序. 在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人.因此需要绘制形状,对它们执行其他操作而不必知道图形是什么.当然 ...

  5. Latent Dirichlet Allocation 文本分类主题模型

    文本提取特征常用的模型有:1.Bag-of-words:最原始的特征集,一个单词/分词就是一个特征.往往一个数据集就会有上万个特征:有一些简单的指标可以帮助筛选掉一些对分类没帮助的词语,例如去停词,计 ...

  6. Linux开机流程

    在开机时,由于80x86的特性CS(Code Segment)这个寄存器中放的都是1,而IP(Instruction Pointer)这个寄存器中全部放着0,换句话说,CS=FFFF而IP=0000. ...

  7. 十四、Java基础---------String、StringBuffer、StringBuilder基本应用

    在前面的博客中曾提及Java的数据类型分为基本数据类型,和引用数据类型,而String便是最常见的应用数据类型,本文将着重介绍这一引用数据类型的用法. String 字符串     String类是对 ...

  8. Java中的4种代码块

    一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args ...

  9. 【转】 MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

    转载地址:http://www.infoq.com/cn/news/2013/12/mysql-vs-postgresql 如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与Post ...

  10. 实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。

    (1)Person类中的属性有:姓名name(String类型),地址address(String类型), 电话号码telphone(String类型)和电子邮件地址email(String类型): ...