什么是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. 白话学习MVC(七)Action的执行一

    一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...

  2. WkHtmlToPdf 生成 PDF

    1. 首先去http://wkhtmltopdf.org/downloads.html 下载最新版本的安装包 2. 执行安装完成 3. CMD 命令行运行wkhtmltopdf.exe程序生成PDF ...

  3. 用 python 实现一个多线程网页下载器

    今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...

  4. AJAX-----05XMLHttpRequest对象的用post方式进行ajax请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Qt之多窗口切换

    在新建对象(下一页面)的时候,把自身的this指针带进去,然后把自身hide(),隐藏起来,在(下一页面中)要回退的时候只需通过: 1. parentWidget()->show(); //显示 ...

  6. VS 编辑并继续(转载)

    转]Microsoft Visual Studio vs2008 vs2010 调试 编辑 修改 代码 在vs2008的文件菜单下,前两个菜单项分别是新建项目 和 新建网站. 这两项里,都可以建web ...

  7. Dynamics AX 2012 R3 Demo 安装与配置 - 编译和配置 (Step 3)

        在前两节中,Reinhard主要讲解了如何配置安装环境,安装数据库服务器,AOS和客户端.至此安装工作已经结束,下面Reinhard开始讲解如何编译和配置.     运行客户端后,系统弹出初始 ...

  8. 【转】SVN库的迁移

    转载地址:http://blog.csdn.net/windone0109/article/details/2841294 SVN服务器由于硬盘空间不足,需要将其迁移到另外一台机器上,并且更换Repo ...

  9. Linux phpbb论坛的安装(英文版)

    1:建立文件夹

  10. 【Session】Tomcat中Session的外置

    > 参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化. ...