用python建立socket_python网络编程学习笔记(二):socket建立网络客户端

本文介绍了Python网络编程的基础知识,包括socket对象的创建、连接过程、端口号查询、信息获取及错误处理等内容。

1、建立socket

建立socket对象需要搞清通信类型和协议家族。通信类型指明了用什么协议来传输数据。协议的例子包括IPv4、IPv6、IPX\SPX、AFP。对于internet通信,通信类型基本上都是AF_INET(和IPv4对应)。协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM。因此对于TCP通信,建立一个socket连接的语句为:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

对于UDP通信,建立一个socket连接的语句为:

s=socket.socket(socket.AF_INET,SOCK_DGRAM)

2、连接socket

连接socket需要提供一个tuple,包括host(主机名或者IP)和port(远程端口),类似代码为:

s.connect(("www.baidu.com",80)

3、寻找端口号

socket库中利用getservbyname()函数可以查询端口号,一般需要两个参数:一是协议名,如http、smtp、pop3等,一个是端口名,如tcp、udp

例如:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

port=socket.getservbyname('http','tcp')

port的返回值为80。若改为:

port=socket.getservbyname('smtp','tcp')

port的返回值为25。

4、从socket获取信息

建立socket连接后,可以通过getsockname()获取本身的ip地址和端口号,也可以通过getpeername()显示远程机器的ip地址和端口号。

如:在python shell中

>>> import socket

>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

>>> port=socket.getservbyname('http','tcp')

>>> s.connect(('www.baidu.com',port))

>>> print s.getsockname()

('192.168.87.138', 3213)

>>> print s.getpeername()

('220.181.111.147', 80)

Socket 模块的类方法

类方法 说明

Socket 低层网络接口(每个 BSD API)

socket.socket(family, type) 创建并返回一个新的 socket 对象

socket.getfqdn(name) 将使用点号分隔的 IP 地址字符串转换成一个完整的域名

socket.gethostbyname(hostname) 将主机名解析为一个使用点号分隔的 IP 地址字符串

socket.fromfd(fd, family, type) 从现有的文件描述符创建一个 socket 对象

Socket 模块的实例方法

实例方法 说明

sock.bind( (adrs, port) ) 将 socket 绑定到一个地址和端口上

sock.accept() 返回一个客户机 socket(带有客户机端的地址信息)

sock.listen(backlog) 将 socket 设置成监听模式,能够监听 backlog 外来的连接请求

sock.connect( (adrs, port) ) 将 socket 连接到定义的主机和端口上

sock.recv( buflen[, flags] ) 从 socket 中接收数据,最多 buflen 个字符

sock.recvfrom( buflen[, flags] ) 从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号

sock.send( data[, flags] ) 通过 socket 发送数据

sock.sendto( data[, flags], addr ) 通过 socket 发送数据

sock.close() 关闭 socket

sock.getsockopt( lvl, optname ) 获得指定 socket 选项的值

sock.setsockopt( lvl, optname, val ) 设置指定 socket 选项的值

举例:

>>> import socket

>>> socket.gethostbyname('www.baidu.com')

'220.181.111.147'

>>> socket.gethostbyname('www.126.com')

'123.125.50.22'

>>> socket.getfqdn('123.125.50.22')

'123.125.50.22'

这里getfqdn却不能返回域名?

5、处理错误关于错误异常的处理,主要就是用try、except语句。如将python网络编程学习笔记(1)中gopherclient.py进行一下修改:

# -*- coding: cp936 -*-

##modify by 小五义

import socket,sys

port =70

host=sys.argv[1]

filename=sys.argv[2]

try:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

except Socket.error,e:

print "建立socket错误:%s"%e

try:

s.connect((host,port))

except socket.gaierror,e:

print "host或者端口错误:%s" %e

except socket.error,e:

print "连接错误:%s" %e

try:

s.sendall(filename+"\r\n")

except socket.error,e:

print "数据发送错误:%s" %e

sys.exit(1)

while 1:

try:

buf=s.recv(2048)

except socket.error,e:

print "接收错误:%s"%e

sys.exit(1)

if 'does not exist' in buf:

print "%s文件不存在" %filename

else:

if not len(buf):

break

sys.stdout.write(buf)

运行结果是:

C:\>python gopherclient.py quux.org/ wh.txt

连接错误:[Errno 10060]

数据发送错误:[Errno 10057] 由于套接字没有连接并且(当

据报套接字时)

C:\>python gopherclient.py quux.org wh.txt

wh.txt文件不存在

=======================================================================================================================

对python网络编程学习笔记(1)的添加

笔记1中在dos下运行python gopherclient.py quux.org系统提示出错的问题,终于明白了。错误原因是少了文件名。如在quux.org/有whatsnew.txt,于是在dos下运行python gopherclient.py quux.org whatsnew.txt。这时会将whatsnew.txt的内容全部列出。

好的,关于Python Socket服务器,以下是一些基本的学习笔记: 1. 创建Socket服务器 使用Python中的`socket`模块创建Socket服务器,可以使用`socket()`函数来创建一个Socket对象,如下所示: ```python import socket # 创建一个Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中,第一个参数`AF_INET`表示使用IPv4地址族,第个参数`SOCK_STREAM`表示使用TCP协议,如果使用UDP协议,则应该使用`SOCK_DGRAM`。 2. 绑定Socket服务器 在创建Socket对象之后,需要使用`bind()`方法将Socket对象和一个IP地址及端口号绑定在一起,如下所示: ```python # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8888)) ``` 其中,`bind()`方法的参数是一个元组,第一个元素是IP地址,第个元素是端口号。 3. 监听Socket服务器 在绑定IP地址和端口号之后,需要使用`listen()`方法开始监听Socket服务器,如下所示: ```python # 开始监听 server_socket.listen(5) ``` 其中,`listen()`方法的参数表示最大连接数,即同时可以连接的客户端数量。 4. 接受客户端连接 当有客户端连接到Socket服务器时,需要使用`accept()`方法来接受客户端连接,如下所示: ```python # 接受客户端连接 client_socket, client_address = server_socket.accept() ``` 其中,`accept()`方法返回一个元组,第一个元素是客户端Socket对象,第个元素是客户端的IP地址和端口号。 5. 接收和发送数据 客户端连接到Socket服务器之后,就可以进行数据的接收和发送了,使用`recv()`方法接收客户端发送的数据,使用`send()`方法向客户端发送数据,如下所示: ```python # 接收客户端数据 data = client_socket.recv(1024) # 发送服务器数据 client_socket.send(b'Hello, client!') ``` 其中,`recv()`方法的参数表示接收数据的最大字节数,`send()`方法的参数是要发送的数据,需要将其转换为字节串。 6. 关闭Socket服务器 当与客户端的通信完成后,需要使用`close()`方法关闭Socket服务器,如下所示: ```python # 关闭Socket服务器 server_socket.close() ``` 以上是关于Python Socket服务器的一些基本学习笔记,希望对你有所帮助。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值