`
颜喜班
  • 浏览: 6963 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多

 

2.1 理解socket
socket 是操作系统中I/O系统的延伸部分,它可以使进程和机器之间通信成为可能。
把对网络支持加入操作系统,是以一种扩展现有文件描述符结构的方法来实现的。
Python通过socket模块提供访问操作系统socket库的接口,建立socket时,你只需要调用这个模块的函数和常量。
2.2 建立socket
对于一个客户端来说,建立一个socket需要两个步骤:

  • 建立一个实际的socket对象

            需要告诉系统两件事,通信类型的协议家族,通信类型指明用什么协议来传输数据,

            如IPV4、IPV6、IPX/SPX、             AFP,目前大多数据都是 IPV4,对应AF_INET .

            协议家族一般表示TCP通信(SOCK_STREAM)或表示UDP通信(SOCK_DGRAM)
            s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

  • 连接到远程服务器上

           s.connect((“www.example.com”,80))


connect.py
#!/usr/bin/python
import socket

print "Creatint socket....."
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "done."

print "Connecting to remote host..."
s.connect(("www.google.com",80))
print "done."
2.2.1 寻找端口号
你可以通过/etc/services知道已知服务器端口号列表。
getservbyname()函数需要两个参数 协议名、端口名。
connect2.py
#!/usr/bin/python
import socket

print "Creating socket...."
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "done."

print "looking up port number..."
port = socket.getservbyname('http','udp')
print "done."

print "Connecting to remote host on port %d..." %port
s.connect(("www.google.com",port))
print "done."
2.2.2 从socket获取信息
connect3.py
#!/usr/bin/python
import socket

print "Creating socket...."
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "done."

print "looking up port number..."
port = socket.getservbyname('http','udp')
print "done."

print "Connecting to remote host on port %d..." %port
s.connect(("www.google.com",port))
print "done."

print "Connecting from",s.getsockname()
print "Connecting to",s.getpeername()
第一条显示你本身的IP地址和端口号(端口号由操作系统分配)
第二条显示远程机器的IP地址和端口号
2.3 利用socket通信
建立socket通信后,就可以利用它进行发送和接收数据,Python提供两种方法:

  • socket对象

         socket对象提供了操作系统的send() 、sendto()、recv()、recvfrom()调用的接口。
         特殊需求时,如读写数据时协议可以详细控制、使用二进制协议传送固定大小数据时、

         数据超时需要特别处理时、    编写UDP程序时,都需要用socket对象。

  • 文件类对象

         文件对象提供了read()、write()和readline()这些更典型的Python接口。
         文件对象很难用于UDP
2.4 处理错识
在Python中,当网络出现错误时,socket代码会产生异常。这些错误是网络程序不能忽略的。
2.4.1 socket异常
socketerror.py
#!/usr/bin/python
import socket,sys

host = sys.argv[1]
textport = sys.argv[2]

try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error,e:
print "Strange error createing socket:%s" %e
sys.exit(1)

try:
port = int(textport)
except ValueError:
try:
    port = socket.getservbyname(textport,'tcp')
except socket.error,e:
    print "Counldn't find your port:%s" %e
    sys.exit(1)

try:
  s.connect((host,port))
except socket.gaierror,e:
  print "Address -related error connecting to sever:%s" %e
  sys.exit(1)
except socket.error,e:
  print "Connecting error %s" %e
  sys.exit(1)

try:
   s.sendall("GET / HTTP/1.0\r\n\r\n")
except socket.error,e:
  print "Error sending data:%s" %e
  sys.exit(1)
s.shutdown(1)

while 1:
  try:
   buf = s.recv(2048)
  except socket.error,e:
   print "Error receiving data:%s" %e
   sys.exit(1)
  if not len(buf):
    break;
  sys.stdout.write(buf)
Python的socket模块定义4种可能的异常:

  • 与一般I/O和通信问题有关的socket.error;
  • 与查询地址有关的socket.gaierror;
  • 与其它地址错误有关的socket.herror;
  • 与在一个socket上调用settimeout()后,处理超时有关的socket.timeout;

2.4.2 遗漏的错误
对于很多操作系统,有时候在网络上发送的数据调用会在远程服务器确保已经收到信息之前返回,因此很有可能一个来自对sendall()成功调用返回的数据,事实上永远没有被收到。
为了解决这个问题,一旦结束写操作,你应该立即调用shutdown()函数,这样会强制清除缓存里面的内容,同时如果有任何问题会产生一个异常。
请牢记,数据只有在你调用了shutdown()函数才能确保被发送。
shutdown.py
#!/usr/bin/python
import socket,sys,time

host = sys.argv[1]
textport = sys.argv[2]
filename = sys.argv[3]

try:
s =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error,e:
print "Strage error creating socket:%s" %e
sys.exit(1)

try:
port = int(textport)
except ValueError:
  try:
   port = socket.getservbyname(textport,'tcp')
  except socket.error,e:
   print "Couldn't find your port :%s" %e
   sys.exit(1)

try:
s.connect((host,port))
except socket.gaierror,e:
print "Address -related error connecting to server: %s" %e
sys.exit(1)
except socket.error,e:
print "Connection error:%s" %e
sys.exit(1)

print "sleeping......"
time.sleep(10)
print "Continuing."

try:
  s.sendall("GET / HTTP/1.0\r\n\r\n")
except socket.error,e:
  print "Error sending data:%s" %e
  sys.exit(1)

s.shutdown(1)


while 1:
try:
  buf = s.recv(2048)
except socket.error,e:
  print "Error receiving data:%s" %e
  sys.exit(1)
if not len(buf):
    break;
sys.stdout.write(buf)

s.close()
2.4.3 文件类对象引起的错误
shutdownfile.py
import socket,sys,time

host = sys.argv[1]
textport = sys.argv[2]
filename = sys.argv[3]

try:
s =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error,e:
print "Strage error creating socket:%s" %e
sys.exit(1)

try:
port = int(textport)
except ValueError:
  try:
   port = socket.getservbyname(textport,'tcp')
  except socket.error,e:
   print "Couldn't find your port :%s" %e
   sys.exit(1)

try:
s.connect((host,port))
except socket.gaierror,e:
print "Address -related error connecting to server: %s" %e
sys.exit(1)
except socket.error,e:
print "Connection error:%s" %e
sys.exit(1)
fd = s.makefile('w',0)

print "sleeping......"
time.sleep(10)
print "Continuing."

try:
  fd.write("GET / HTTP/1.0\r\n\r\n")
except socket.error,e:
  print "Error sending data:%s" %e
  sys.exit(1)

s.shutdown(1)


while 1:
try:
  buf = fd.read(2048)
except socket.error,e:
  print "Error receiving data:%s" %e
  sys.exit(1)
if not len(buf):
    break;
sys.stdout.write(buf)

s.close()
2.5 使用UDP
Udp通信几乎不使用文件类对象,因为它们往往不能为数据如何发送和接收提供足够的控制。
udp.py
#!/usr/bin/python
import socket,sys

host = sys.argv[1]
port = int(sys.argv[2])
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect((host,port))
while 1:
print "\nEnter data to transmit:"
data = sys.stdin.readline().strip()
s.sendall(data)
buf = s.recv(2048)
if not len(buf):
   break
sys.stdout.write(buf)
该代码连接服务器(第三章 udp服务器例子),输入要发送的一行文字,数据发送后,进入一个无限循环来等待回复。
该程序发送一个UDP信息包,接收一个UDP信息包,并继续等待其他的信息包,最后,它被Ctrl-C 终止。
UDP客户端与TCP客户端区别:

  • 建立socket时,UDP采用SOCK_DGRAM,TCP用SOCK_STREAM。
  • 程序没有办法探测到服务器什么时候发送完数据,connect()的调用只是初始化一些内在参数。

udptime.py
import socket,sys,struct,time
host = '210.72.145.44'
port = 37

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('',(host,port))

buf = s.recvfrom(2048)[0]
if len(buf) !=4:
  print "Wrong-sized reply %d:%s" % (len(buf),buf)
  sys.exit(1)

secs = struct.unpack("!I",buf)[0]
secs -= 2208988800
print time.ctime(int(secs))
2.6 总结
网络通信的基本接口是socket,它扩展了操作系统的基本I/O到网络通信,socket可以通过socket函数来建立,通过connect()函数来连接,得到了socket,你可以确定本地和远程端点Ipf 地址和端口号,socket对不同的协议来说过生日 一种通用的接口,它可以处理TCP和UDP通信。
当进行网络通信时,错误检查很重要,使用shutdown()可以确保当有写错误发生时,能得到提醒。
Python提供了两种和socket工作的接口:用于UDP和高级TCP目的标准 socket接口,以及用于简单TCP通信的文件类接口。

 

分享到:
评论

相关推荐

    第二章 客户端脚本安全1

    第二章 客户端脚本安全1

    JS完全解析第二章 - 客户端JS和ECMA基础

    JS可以运行不同的平台上,而最常见的就是浏览器,我们把这种运行在浏览器端的JS叫做客户端。...客户端JS分为ECMA和浏览器本身的对象,本章属于一个概述部分和基础部分,从这两方面讲解了串讲了客户端JS的各种操作。

    Python编程笔记 Python开发知识总结整理 Python核心笔记 共51页.pdf

    第二章 快速入门 第三章 Python 基础 第四章 Python对象 第五章 数字 第六章 序列:字符串、列表和元组 第七章 映射和集合类型 第八章 条件和循环 第九章 文件和输入输出 第十章 错误和异常 第十一章 函数...

    (计算机网络(第五版) 谢希仁著 第二章参考答案.

    (计算机网络(第五版) 谢希仁著 第二章参考答案非常全,希望能帮到你!一般的都不很全,这个是全部答案!

    Python核心编程(第二版)PDF高清 part1 共2部分

    第1部分 Python核心 第1章 欢迎来到Python世界 ... 第17章 网络客户端编程 第18章 多线程编程 第19章 图形用户界面编程 第20章 Web编程 第21章 数据库编程 第22章 扩展Python 第23章 其他话题

    Python基础理论核心笔记汇总

    第二章 快速入门 8 第三章 Python 基础 10 第四章 Python 对象 12 第五章 数字 14 第六章 序列: 字符串、列表和元组 16 第七章 映射和集合类型 18 第八章 条件和循环 20 第九章 文件和输入输出 22 第十章 ...

    php 简明教程.zip

    第二章 Web 客户端技术 16 第一节 Web客户端工作原理 16 1.浏览器工作原理 . 16 2.HTML工作原理 . 16 3.JavaScript工作原理 ... 20 第二节 Web客户端基本技术 21 第三节 实验二 Web客户端技术 .... 34 第三章 PHP...

    Linux系统管理完全手册--part02(共2卷)

    第二章 桌面 第三章 使用shell程序 第四章 理解用户和文件系统 第五章 理解文本处理过程 第六章 进程管理 第七章 使用网络客户端程序 第八章 安装Linux 第九章 理解系统初始化过程 第十章 管理软件包和文件系统 第十...

    基于移动设备的网络教学系统设计与实现.docx

    第二章 相关理论及技术综述 7 2.1B/S 结构 7 2.2移动网络平台 8 2.3ASP 动态网页技术 13 2.4移动互联网技术 15 第三章 网络教学系统需求分析 17 3.1系统概述 17 3.2系统功能需求 18 3.2.1管理员模块 19 3.2.2教师...

    Linux系统管理完全手册--part01(共2卷)

    第二章 桌面 第三章 使用shell程序 第四章 理解用户和文件系统 第五章 理解文本处理过程 第六章 进程管理 第七章 使用网络客户端程序 第八章 安装Linux 第九章 理解系统初始化过程 第十章 管理软件包和文件系统 第十...

    Linux网络编程电子书.rar

    第二章 tcp/ip 第三章 套接字函数 第四章 tcp客户机服务器程序实例 第五章 udp套接字 第六章 进程和信号 第七章高级套接字函数 第八章 套接字选项 第九章 进程间的通信 第十章 带外数据 第十一章 原始套接字 第十二...

    第二章课后习题1

    第二章课后习题一、填空题1.在Windows中MySQL服务进程名是?2.MySQL服务器安装时默认用户名是?客户端连接到服务器默认使用的端口号是?3.命令提示

    Unity3D网络游戏实战游戏开发与设计技术丛书

    第二部分“网络原理”:第6章至第8章,主要介绍网络通信的原理,开发客户端的网络模块和服务端程序框架。这套框架具有较高的通用性,可以运用在多种游戏上。 第三部分“网络游戏”:第9章至第12章,主要讲解房间系统...

    网络营销网络营销基础与实践读书笔记常用网络营销工具和方法.doc

    2011年5月12日星期四 《第二章网络营销的常用工具和方法》 网络营销信息传递原则之壹是建立尽可能多的网络营销信息传递渠道,因此,就需要 借助各种有效的营销工具。网络营销的各种职能也是通过各种营销方法来实现的...

    PHP基础教程--入门经典

    第一章 PHP简介 第二章 Web客户端技术 第三章 PHP语法 第四章 MySQL数据库 第五章 Web软件开发

    一些实用网络编程(第二章)

    共有十个实例,有域名查询,FTP客户端,增加点击数,FTP文件浏览,IP包监视工具,检索局域网,ENUMPROT,FTPSERVER等

    PHP程序设计简明教程

    基础的PHP教程,适合初学者学习 第一章 PHP简介 第二章 Web 客户端技术 第三章 PHP语法 第四章 MySQL数据库 第五章 Web 软件开发

    NettyInAction中文版.docx

    在你的机器上运行第二章编写的Netty服务器和客户端。 Netty是一个NIO client-server(客户端服务器)框架,使用Netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来使开发网络应用程序,...

    Solaris 系统 管理 员 培训

    第二章 网络服务 29 第三章 路由和网关 31 第四章 DNS客户端的设置 32 Solaris使用技巧 33 取消root只能在控制台登陆的限制 33 取消root不能登录FTP的限制 33 在从WINDOWS传到UNIX在每行的结尾可能会出现^M 34 取消^...

    PHP基础教程-推荐教

    第二章 Web客户端技术 16 第一节 Web客户端工作原理 16 1.浏览器工作原理 16 2.HTML工作原理 16 3.JavaScript工作原理 20 第二节 Web客户端基本技术 21 第三节 实验二 Web客户端技术 34 第三章 PHP语法 36 第一节 ...

Global site tag (gtag.js) - Google Analytics