主要使用的模块是socket模块,在这个模块中可以找到socket()函数,该函数用于创建套接字对象。套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。

1、socket类型

构造函数:

socket.socket(family=AF_INETtype=SOCK_STREAMproto=0fileno=None)

family: 套接字地址家族,Python支持 AF_INET (默认),AF_INET6AF_UNIXAF_CAN 和 AF_RDS

type:套接字类型,SOCK_STREAM (默认), SOCK_DGRAMSOCK_RAW

proto:协议编号(默认为0)

2、socket常量

socket常量 描述
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
socket.AF_INET 服务器之间网络通信,IPv4
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流套接字,实现TCP协议
socket.SOCK_DGRAM 数据包类型套接字,实现UDP协议
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

3、socket函数

socket函数 描述
服务器端函数
socket.bind(address) 将套接字绑定到网络地址,address格式为(host, port)
socket.listen([backlog]) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。
socket.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
客户端函数
socket.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
socket.connect_ex(adddress) 功能与connect(address)相同,但是成功返回0,失败返回errno的值。
socket公用函数
socket.resv(buffsize[,flags]) 接受套接字的数据。数据以bytes形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
socket.resvfrom(buffsize[,flags]) 接受套接字的数据。与recv()类似,但返回值是(data,address)。其中data是bytes对象,包含接受的数据,address是发送数据的套接字地址。多用于UDP
socket.send(bytes[,flags]) 发送数据到套接字,该套接字必须为已连接的远程套接字(TCP)。可返回发送数据的字节数。应用程序负责检查所有的数据是否已经发送;如果只传输一些数据,应用程序需要尝试交付剩余的数据
socket.sendall(bytes[,flags]) 类似send()函数,但该函数会一直发送数据知道发送完毕或发生错误
socket.sendto(bytes, addtess) 发送数据到套接字,该套接字不应已连接到远程套接字(UDP),目标套接字由address提供
socket.close() 关闭套接字
socket.getpeername() 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)
socket.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port)
socket.setsockopt(level,optname,value) 设置给定套接字选项的值
socket.getsockopt(level,optname[.buflen]) 返回套接字选项的值
socket.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
socket.gettimeout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None
socket.fileno() 套接字的文件描述符
socket.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
socket.makefile() 创建一个与该套接字相关连的文件

4、socket编程模型

代码实例:

TCP服务器及客户端代码

 #!/usr/bin/python
# -*- coding:utf-8 -*-
import socket
import threading
from time import asctime
from multiprocessing import Lock lock = Lock() def tcplink(sock, addr):
print('. . . connecting from %s:%s ' % addr)
sock.send(b'Welcome !')
while True:
# 接收数据
data = sock.recv(1024)
if not data or data.decode('utf-8') == 'exit':
break
# 通过在客户端中输入口令和密码来关闭服务器
elif data.decode('utf-8') == 'close the server!':
global server passwd = sock.recv(1024)
if passwd.decode('utf-8') == '':
with lock:
server.close() return # 跳出函数tcplink,则子进程也执行完毕
else:
# 发送数据
sock.send(('%s %s' % (asctime(), data.decode())).encode())
# 客户端已关闭,关闭该临时套接字
sock.close()
print('Connection from %s:%s close . . .' % addr) ip_port = ('127.0.0.1', 5110)
# 创建基于IPv4和TCP协议的socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口
server.bind(ip_port)
# 监听端口
server.listen(5)
print('Server is open\n*********************************') while True:
try:
print('Waiting for new connection . . . ')
# 接受一个新链接
# sock为临时套接字,用于客户端与服务器的数据交互
sock, addr = server.accept() # 当服务器被子进程中关闭会有OSError
# 创建新线程来处理TCP连接
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
except OSError:
print('*********************************\nServer is closed')
exit()

TCP服务器

 #!/usr/bin/python
# -*- coding:utf-8 -*-
import socket ip_port = ('127.0.0.1', 5110)
# 创建基于IPv4和TCP协议的socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
client.connect(ip_port)
print(client.recv(1024).decode()) while True:
data = input('Please enter data: ')
# 发送数据
client.send(data.encode())
if not data or data == 'exit':
break
# 监听到输入为关闭服务器的特殊口令时:
elif data == 'close the server!':
passwd = input('Password: ')
client.send(passwd.encode())
print(client.recv(1024).decode())
client.close()

TCP客户端

UDP服务器及客户端代码

#!/usr/bin/python
# -*- coding:utf-8 -*-
import socket
from time import asctime ip_port = ('127.0.0.1', 5002)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(ip_port)
print('Server is opening . . . ') while True:
print(' . . . Waiting for new connection')
data, addr = server.recvfrom(1024)
if data == b'close the server!':
print('get close')
passwd = server.recv(1024)
if passwd == b'':
server.sendto(b'Server is closed !', addr)
break
elif not data or data == b'exit':
pass
else:
print('Received from %s:%s . . . ' % addr)
server.sendto(b'%s <--> %s' % (asctime().encode(), data), addr)
server.close()

UDP服务器

#!/usr/bin/python
# -*- coding:utf-8 -*-
import socket ip_port = ('127.0.0.1', 5002)
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True:
data = input('Please input: ')
if not data or data == 'exit':
break
elif data == 'close the server!':
client.sendto(data.encode(), ip_port)
passwd = input('Password: ')
client.sendto(passwd.encode(), ip_port)
else:
client.sendto(data.encode(), ip_port)
response = client.recv(1024).decode()
print(response) client.close()

UDP客户端

参考和引用:

http://yangrong.blog.51cto.com/6945369/1339593/

http://www.cnblogs.com/aylin/p/5572104.html

https://docs.python.org/3/library/socket.html

python学习记录-socket模块的更多相关文章

  1. Python 学习记录之----模块 paramiko

    paramiko 一.安装 pip3.5 install paramiko pip3.5 install pycrypto # pycrypto,由于 paramiko 模块内部依赖pycrypto, ...

  2. python学习之socket模块

    socket.socket(family=AF_INET,type=SOCK_STREAM,proto=,fileno=None) 使用给定的地址族,套接字类型和协议号创建一个新的套接字.family ...

  3. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  4. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  5. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  6. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  7. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  8. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  9. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

随机推荐

  1. JS学习三(函数)

    [函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,.. ...

  2. 团队作业10——复审与事后分析(Beta版本)

    Deadline: 2017-6-13 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目内容为后文的两个方面 Beta阶段项目复审(单独一篇博客) 事后诸葛亮分析报告(单独 ...

  3. 第2周作业-Java基本语法与类库

    1. 本周学习总结 答:① 定义流程控制的各种条件式是同以前学习的一样,要善于运用快捷键.(例如`a/t` + `/` ) ② 熟悉输入输出的使用,注意输入的变量类型使用相应的输入类. ③ 数组对象: ...

  4. 201521123103 《java学习笔记》 第十周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 二.书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学 ...

  5. 201521123011 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口: 常用应用层协议:http, ftp 域名(通过域名可以找到IP)用ping测试 ...

  6. 201521123051《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ·所有的异常类是从 java.lang.Exception 类继承的子类. ·Exception 类是 Throwa ...

  7. 201521123054 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping c ...

  8. 模拟实现一个ATM+购物商城程序

    记得上次小编上传了一个购物车程序,这次呢稍微复杂一点,还是那句话,上传在这里不是为了炫耀什么,只是督促小编学习,如果大神有什么意见和建议,欢迎指导.(PS:本次主要参考学习为主,自己原创的很少) 要求 ...

  9. ajax中的suceess函数使用this

    今天在写ajax的时候,后台返回数据给前台,可是总是不能把数据正常显示在页面上... 明明已经进入了success函数了,并且在该代码的前后都能够正常执行.. success: function (r ...

  10. JSP获取Cookie对象

    cookie是小段的文本信息,在网络服务器上生成,并发送给浏览器的.通过使用cookie可以标识用户身份,记录用户和密码,跟踪重复用户等.浏览器将cookie以key/value的形式保存到客户机的某 ...