python中的socket网络编程(一)
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。 TCP 是一种面向连接的传输层协议,TCP Socket 是基于一种 Client-Server 的编程模型,服务端监听客户端的连接请求,一旦建立连接即可以进行传输数据。那么对 TCP Socket 编程的介绍也分为客户端和服务端。下面我们看下客户端的实现。
创建socket:
首先要创建 socket,用 Python 中 socket 模块的函数 socket 就可以完成:
#-*- coding: utf-8 -*- import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'socket Created'函数 socket.socket 创建一个 socket,返回该 socket 的描述符,将在后面相关函数中使用。该函数带有两个参数如下:
Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信)Type:套接字类型,可以是 SOCKET_STREAM(流式套接字,主要用于 TCP 协议)或者SOCKET_DGRAM(数据报套接字,主要用于 UDP 协议)错误处理:
如果创建 socket 函数失败,会抛出一个 socket.error 的异常,需要捕获。
# -*- coding: utf-8 -*- import socket import sys #创建套接字,创建失败时会抛出一个 socket.error 的异常,需要捕获 try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) except socket.error,msg: print 'Failed to create socket. Error code: '+ str(msg[0]) + ' ,Error message : ' + msg[1] sys.exit(); print 'socket Created'连接服务器:
socket 使用 (IP地址,协议,端口号) 来标识一个进程,那么我们要想和服务器进行通信,就需要知道它的 IP地址以及端口号。
Python 提供了一个简单的函数 socket.gethostbyname 来获得远程主机的 IP 地址:
#获取服务器IP地址 host = 'www.baidu.com' port = 80 try: remote_ip = socket.gethostbyname( host ) except socket.gaierror: #could not resolve print 'Hostname could not be resolved. Exiting' sys.exit() print 'Ip address of ' + host + ' is ' + remote_ip使用连接函数 connect 连接到该 IP 的某个特定的端口上了,下面例子连接到 80 端口上(是 HTTP 服务的默认端口):
#连接服务器 s.connect((remote_ip , port)) print 'Socket Connected to ' + host + ' on ip ' + remote_ip发送数据:
例如发送字符串GET / HTTP/1.1\r\n\r\n,这是一个 HTTP 请求网页内容的命令。
#发送数据 message = "GET / HTTP/1.1\r\n\r\n" try : #Set the whole string s.sendall(message) except socket.error: #Send failed print 'Send failed' sys.exit() print 'Message send successfully'接收数据:
#接受服务器反馈的数据 reply = s.recv(4096) print reply关闭socket:
当我们不想再次请求服务器数据时,可以将该 socket 关闭,结束这次通信。
#关闭套接字时,可以将该 socket 关闭,结束这次通信。
#关闭套接字 s.close()运行结果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JdsfA4F3-1593526521125)(http://odsh9s4s2.bkt.clouddn.com/client-return.png)]
python网络编程客户端,我们需要经过如下五步:
创建socket连接到服务器发送数据接收数据关闭socket