如何建立Socket连接:TCP与UDP通信类型及协议家族详解

1、建立socket

如何建立Socket连接:TCP与UDP通信类型及协议家族详解

建立 socket 对象需要明确通信类型以及协议家族。通信类型能够指明使用何种协议来传输数据。像 IPv4、IPv6、IPX\SPX、AFP 等都是协议的例子。在 internet 通信中,通信类型通常都是 AF_INET,它与 IPv4 相对应。协议家族通常能体现 TCP 通信的 SOCK_STREAM 或者 UDP 通信的 SOCK_DGRAM。所以针对 TCP 通信而言,构建一个 socket 连接的语句是:

创建一个套接字对象,使用的协议族是 IPv4(socket.AF_INET),套接字类型是流套接字(socket.soCK_STREAM),通过 socket.socket 函数来实现,将创建的套接字对象赋值给变量 s 。

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

创建一个套接字对象 s,该套接字使用 IPv4 地址族(socket.AF_INET)和数据报套接字类型(SOCK_DGRAM)。

2、连接socket

连接 socket 时需要提供一个由 host(主机名或者 IP)和 port(远程端口)组成的 tuple。例如以下代码:

s 与 ("www.baidu.com", 80) 建立连接。

3、寻找端口号

在 socket 库中,通过 getservbyname()函数能够进行端口号的查询。通常需要两个参数,其一为协议名,像 http、smtp、pop3 之类;其二为端口名,例如 tcp、udp。

例如:

import socket

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

获取名为“http”的服务在“tcp”协议下的端口号,该端口号赋值给变量 port,即 port 等于 socket.getservbyname('http','tcp')。

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

获取名为“smtp”的服务在“tcp”协议下的端口号,该端口号赋值给变量 port,port 等于 socket.getservbyname('smtp','tcp')

port的返回值为25。

4、从socket获取信息

建立 socket 连接之后,能够通过 getsockname()来获取自身的 ip 地址以及端口号。同时,也可以借助 getpeername()来显示远程机器的 ip 地址和端口号。

如:在python shell中

>>> import socket

创建一个套接字对象,该套接字使用 IPv4 地址族(socket.AF_INET)和流式套接字类型(socket.soCK_STREAM)。具体代码为:socket.socket(socket.AF_INET,socket.soCK_STREAM) 。

端口等于通过 socket.getservbyname 函数获取名为“http”且协议为“tcp”的服务所对应的端口号。

s 与 ('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 会创建并返回一个新的 socket 对象,其中 family 和 type 是参数。

socket.getfqdn(name) 会把由点号分隔的 IP 地址字符串转变为一个完整的域名。

主机名通过 socket 被解析为一个使用点号分隔的 IP 地址字符串。

使用现有的文件描述符 fd 创建一个 socket 对象,指定家族 family 和类型 type,通过 socket.fromfd 函数来实现

Socket 模块的实例方法

实例方法 说明

sock 把自身绑定到一个由地址 adrs 和端口 port 组成的组合上

sock.accept() 会返回一个客户机的 socket,并且这个 socket 带有客户机端的地址信息。

sock 会将自身设置为监听模式,从而能够对 backlog 所对应的外来连接请求进行监听。

sock 连接到由 adrs 和 port 所定义的主机和端口上

sock 从其中接收数据,接收的数据最多为 buflen 个字符,通过 recv( buflen[,flags] ) 这个操作从 socket 接收数据

sock 接收数据,接收的数据最多为 buflen 个字符,通过 sock.recvfrom( buflen[,flags] ) 实现,同时会返回数据来源的远程主机和端口号

sock 利用 send 方法来发送数据,发送的内容为 data,还可以附带 flags (可选)

sock 会通过发送数据来进行操作,数据通过 sendto 方法发送,该方法带有参数 data、flags 和 addr ,通过 socket 来完成发送动作

sock.close() 关闭 socket

sock 调用 getsockopt 函数并传入 lvl 和 optname 参数,从而获得指定 socket 选项的值

sock 对指定的 socket 选项进行设置其值的操作,即通过 setsockopt 函数,传入 lvl、optname 和 val 这三个参数来完成设置

举例:

>>> import socket

通过 socket 获取 'www.baidu.com' 的 IP 地址。 先使用 socket 库,然后调用 gethostbyname 函数,传入 'www.baidu.com' 这个参数,最终得到该域名对应的 IP 地址。

'220.181.111.147'

通过 socket 获取 'www.126.com' 的 IP 地址,即调用 socket.gethostbyname 函数并传入 'www.126.com' 作为参数,以获取对应的 IP 地址信息。

'123.125.50.22'

对 '123.125.50.22' 这个 IP 地址使用 socket.getfqdn 方法以获取其完全限定域名。

'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爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读