《Python网络编程攻略》学习笔记

TCP用主机的IP地址加上主机的端口号作为TCP连接的端点,这种端点叫做套接字(socket)或插口

获取远程设备的IP地址

import socket
def get_remote_machine_info():remote_host = "www.python.org"try:print("IP address: %s" % socket.gethostbyname(remote_host)) #参数为远程设备的主机名except socket as err_msg:print("%s: %s" %(remote_host, err_msg))if __name__ == "__main__":get_remote_machine_info()# IP address: 151.101.228.223

将IPv4地址转换成不同的格式

import socket
from binascii import hexlify
def convert_ip4_address():for ip_addr in ["127.0.0.1", "192.168.0.1"]:packed_ip_addr = socket.inet_aton(ip_addr)unpacked_ip_addr = socket.inet_ntoa(packed_ip_addr)print("IP address: %s => packed : %s, Unpacked : %s" % (ip_addr, hexlify(packed_ip_addr).decode(), unpacked_ip_addr))if __name__ == "__main__":convert_ip4_address()# IP address: 127.0.0.1 => packed : 7f000001, Unpacked : 127.0.0.1
# IP address: 192.168.0.1 => packed : c0a80001, Unpacked : 192.168.0.1

通过指定的端口和协议找到服务名

import socket
def find_servert_name():protocolname = "tcp"for port in [80, 25]:# socket.getservbyport(port, protocolname)传入端口号和协议名返回服务名print("Port: %s => service name: %s" % (port, socket.getservbyport(port, protocolname)))print("Port: %s => service name: %s" % (53, socket.getservbyport(53, "udp")))if __name__ == "__main__":find_servert_name()
# Port: 80 => service name: http
# Port: 25 => service name: smtp
# Port: 53 => service name: domain

主机字节序和网络字节序之间相互转换

import socket
def convert_integer():data = 1234# 32-bit# socket.ntohl(data)将32位整数从网络字节序转换为长整型主机字节顺序.# socket.htohl(data)将32位整数从长整型主机字节序转换为网络字节顺序。print("Original: %s => Long host byte order: %s, Network byte order: %s" % (data, socket.ntohl(data), socket.htonl(data)))#16-bit# socket.ntohs(data)将16位整数从网络字节序转换为短整型主机字节顺序.# socket.htohs(data)将16位整数从短整型主机字节序转换为网络字节顺序.print("Original: %s => Short host byte order: %s, Network byte order: %s" % (data, socket.ntohs(data), socket.htons(data)))if __name__ == "__main__":convert_integer()# Original: 1234 => Long host byte order: 3523477504, Network byte order: 3523477504
# Original: 1234 => Short host byte order: 53764, Network byte order: 53764

设定并获取默认的套接字超时时间

import socket
def test_socket_timeout():s = socket.socket()# gettimeout()获取套接字超时时间print("Default socket timeout: %s" % s.gettimeout())s.settimeout(100) #修改超时时间 (参数可以是秒数,非负浮点数,也可以是None)print("Current socket timeout: %s" % s.gettimeout())if __name__ == "__main__":test_socket_timeout()# Default socket timeout: None
# Current socket timeout: 100.0

修改套接字发送和接收的缓冲区大小

import socketSEND_BUF_SIZE = 4096
RECV_BUF_SIZE = 4096
def modify_buff_size():sock = socket.socket()# 获取套接字发送的缓存区大小bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)print("Buffer size [Default]: %d" % bufsize)# 修改套接字对象属性(参数:level,optname, value;optname是选项名,value是该选项名的值)sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)sock.setsockopt(socket.SOL_SOCKET,socket.SO_SNDBUF,SEND_BUF_SIZE)sock.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,RECV_BUF_SIZE)bufsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)print("Buffer size [Current]:%d" % bufsize)if __name__ == "__main__":modify_buff_size()# Buffer size [Default]: 8192
# Buffer size [Current]:4096

把套接字改为阻塞或非阻塞模式

默认情况下,TCP套接字处于阻塞模式中。也就是说,除非完成了某项操作,否则不会把控制权交给程序。

import socket
def test_socket_modes():sock = socket.socket()# 参数为1把套接字设为阻塞模式,参数为0把套接字设为非阻塞模式sock.setblocking(1)sock.settimeout(0.5)sock.bind(("127.0.0.1", 0))socket_address = sock.getsockname()print("在套接字上启动简易服务器: %s" % str(socket_address))while True:sock.listen(1)if __name__ == "__main__":test_socket_modes()# 在套接字上启动简易服务器: ('127.0.0.1', 3873)

重用套接字地址

import socket
import sys
def reuse_socket_addr():sock = socket.socket()old_state = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)print("Old sock state: %s" % old_state)sock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )new_state = sock.getsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR )print("New sock state: %s" % new_state )local_porl = 8282srv = socket.socket()srv.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)srv.bind( ("127.0.0.1", local_porl) )srv.listen()print("Listening on port: %s" %local_porl)while True:try:connection, addr = srv.accept()print("Connected by %s: %s" % (addr[0], addr[1]))except KeyboardInterrupt:breakexcept socket.error as e:print( "%s" % e)if __name__ == "__main__":reuse_socket_addr()# Old sock state: 0
# New sock state: 1
# Listening on port: 8282
# Connected by 127.0.0.1: 4863 用一个客户端连接测试
# Connected by 127.0.0.1: 4864
# Connected by 127.0.0.1: 4865

编写一个简单的回显客户端/服务器应用

服务器端

import socket
server = socket.socket()
server.bind(("127.0.0.1", 9999)) #绑定IP和端口
server.listen(5) #监听
while True:  print("-------正在等待链接-------")  conn, addr = server.accept() #阻塞等待链接  print("--------正在链接中--------")  print(conn)  print(addr)  print("--------已经链接上了-------")  while True:  msg = conn.recv(1024)  if not msg: #如果客户端断开,即conn.recv接收为空,这时就断开,而外循环会等待下一个连接print("client has lost...")break   print("客户端发来的信息:", msg.decode())  conn.send(msg.upper()) #发信息给客户端  conn.close()
server.close() 

客户端

import socket
client = socket.socket()
client.connect(("127.0.0.1", 9999)) #链接IP和端口
while True:  msg = input("输入你要发送的信息>>>:")  if (len( msg ) == 0): continue #如果用户直接回车发送空值,那就跳过本次循环client.send(msg.encode("utf-8")) #向服务器发送信息  data = client.recv(1024) #接收服务器发来的信息,一次接收1K  print("收到服务器发来的信息:", data.decode()) #打印data  client.close() #关闭客户端

Python_套接字、IPv4和简单的客户端/服务器编程相关推荐

  1. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

    第 1 章 套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字 ...

  2. java实现telnet客户端_使用套接字的java简单telnet客户端

    我已经阅读了很多关于这个主题的内容,telnet是一个协议,不是简单的套接字连接,等待换行符,使用外部库等等-- 最重要的是,我需要一个快速而脏的java telnet应用程序启动和运行,不一定可扩展 ...

  3. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  4. 从入门到入土:基于C语言采用TCP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. NC命令行作为服务端、客户端以及win32 套接字程序的简单连接测试

    首先要下载nc命令行工具:非win自带: 下载地址: https://eternallybored.org/misc/netcat/netcat-win32-1.12.zip 如下命令,-l -p , ...

  6. Linux_套接字(C++_TCP回显服务器——多进程/线程池(生产者消费者模型)处理多链接请求)

    文章目录 1.多进程版本 服务端 启动服务端 客户端 启动客户端 本地测试 2.多线程版本 3.模板线程池版本 线程池代码: 设计任务Task.h 服务端代码 1.多进程版本 这里选择创建子进程,让子 ...

  7. Socket基础四:基于流式套接字的网络程序(并发服务器设计)

    作者:刘磊 2020.4.27 参考书目:<Windows网络编程>刘琰等著 并发性 并发性是TCP/IP程序的基础,服务器软件必须在程序中有专门的支持并发的硬件或专门的机制实现并发处理. ...

  8. c 套接字服务器端发送消息,从客户端C、服务器Python Issu发送套接字

    我当前的应用程序包括一个C客户机使用TCP将文件发送到Python服务器.它将生成文件的哈希值并将信息发回.我可以让它与python客户机一起工作,但是在将客户机迁移到C时遇到了问题.python服务 ...

  9. linux网络编程Internet Socket地址,套接字,和函数

    文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...

最新文章

  1. pytorch中的torch.tensor.repeat以及torch.tensor.expand用法
  2. 四个步骤实现层级清晰的导航栏
  3. 北大博士干了半年外卖骑手,写出AI伦理论文登上顶刊,“系统知道一切”
  4. 传清华应届生获Facebook offer
  5. Zabbix基础概念
  6. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
  7. [翻译]高阶Python一学就会
  8. 支付宝手机网站即时交易 自己封装的类
  9. 单例模式2014-12
  10. android投屏 电视软件,高清电视投屏软件下载-高清电视投屏 安卓版v20200802-PC6安卓网...
  11. JAVA电商 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城 直播商城 短视频商城 springcloud商城 spring cloud商城
  12. 六种方法教你更好地使用小型WiFi摄像机
  13. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)
  14. signature=e7a4f21fa0bd38abc7e1a2451a8b7b26,Win10 14328起“迅雷7.9、迅雷极速版”崩溃修正补丁...
  15. java如何处理emoji表情,并存入数据库
  16. 2019年云计算产业市场前景研究,云计算技术发展趋势
  17. 【总结】MyCat分布式数据库中间件
  18. 依次输入十个数 输出最大的数 C语言实现
  19. 开发游戏用的角色人物行走和动作素材图片
  20. css 查看更多_如何查看是否有人蹭网?教你判断是否有人蹭网的方法

热门文章

  1. python 可视化项目_python3项目之数据可视化
  2. delphi 异步 调用 带参数_如何在 Spring 异步调用中传递上下文
  3. 信安教程第二版-第12章网络安全审计技术原理与应用
  4. 分别求两个整数的最大公约数和最小公倍数。_看不懂辗转相除法求最小公约数?以身相许那种哦!...
  5. wangEditor-3.1.1 自己扩展的, 扩展图片添加alt标签
  6. Mac 10.12下安装python3环境
  7. 洛谷 P2097 资料分发1
  8. 深入分析Java Web技术内幕 修订版 pdf
  9. WPF调用图片路径,或资源图片
  10. jQuery进行DOM操作记录