Python 网络编程(Socket)


一、Socket 套接字

1、Socket 编程

  • socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口。Socket 编程是应用进程间通信的抽象机制。
  • 应用编程接口API:应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口
  • Socket 的意思为“插座”。是 BSD UNIX 的进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,提供不同的服务。 客户软件将插头插到不同编号的插座,就可以得到相应的服务。

2、Socket

Socket 标识:

  • 不同主机间 Socket 连接的标识:IP地址+端口号
  • 操作系统/进程管理套接字的标识:套接字描述符(socket descriptor),小整数

Socket 创建:

  • 当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息,返回套接字描述符
  • 每个进程有一个 Socket 描述符表
  • 如果多个进程共享一个套接字,关闭套接字时引用计数减1,减至0才关闭
  • 如果进程中的一个线程将一个套接字关闭,该套接字直接关闭,该进程中的其他线程也将不能访问该套接字

二、TCP

1、客户端

访问网站: HTTP 协议

# 导入socket库
import socket# 创建一个socket,AF_INET 表示采用 IPv4 网络协议,SOCK_STREAM 表示 TCP 连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立连接,需指明端口号,web 服务端口默认为 80
s.connect(('www.baidu.com', 80))# 发送数据
s.send(b'GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection:close\r\n\r\n')# 接收数据
buffer = []
while True:# 每次最多接收1k字节d = s.recv(1024)if d:buffer.append(d)else:break
data = b''.join(buffer)# 关闭连接
s.close()# 解析服务器响应数据
header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件
with open('baidu.html', 'wb') as f:f.write(html)

自定义连接:

# 导入socket库
import socket# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 建立连接
s.connect(('127.0.0.1', 5000))# 接收欢迎消息
print(s.recv(1024).decode('utf-8'))
for data in [b'Python', b'C++', b'AI']:# 发送数据s.send(data)# 接受数据print(s.recv(1024).decode('utf-8'))# 发送结束连接信号
s.send(b'exit')# 关闭连接
s.close()

2、服务器

# 导入 socket 库,threading 库
import socket
import threading
import time# 处理请求函数
def tcp_link(sock, addr):print('Accept new connection from %s:%s...' % addr)sock.send(b'Welcome!')# 接收、发送数据while True:data = sock.recv(1024)time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))# 关闭连接sock.close()print('Connection from %s:%s closed.' % addr)# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定端口
s.bind(('127.0.0.1', 5000))# 监听端口,5表示最多同时监听5个
s.listen(5)
print('Waiting for connection...')# 等待连接,处理连接
while True:# 接受一个新连接sock, addr = s.accept()# 创建新线程来处理TCP连接t = threading.Thread(target=tcp_link, args=(sock, addr))t.start()

三、UDP

1、客户端

# 导入socket库:
import socket# 创建一个socket,SOCK_DGRAM 表示 UDP 连接
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 数据发送与接收
for data in [b'Python', b'C++', b'AI']:# 发送数据:s.sendto(data, ('127.0.0.1', 5000))# 接收数据:print(s.recv(1024).decode('utf-8'))# 关闭连接
s.close()

2、服务器

# 导入socket库:
import socket
import threading# 处理请求函数
def udp_link(data, addr):print('Received from %s:%s.' % addr)s.sendto(b'Hello, %s!' % data, addr)# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定端口:
s.bind(('127.0.0.1', 5000))
print('Bind UDP on 5000...')# 等待接收数据并处理
while True:# 接收数据:data, addr = s.recvfrom(1024)t = threading.Thread(target=udp_link, args=(data, addr))t.start()

GOOD LUCK!


Python 网络编程(Socket)相关推荐

  1. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  2. 树莓派 Python 网络编程 (Socket入门)

    树莓派  Python 网络编程 (Socket入门) 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络 ...

  3. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. python网络编程-socket编程

    一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层模 ...

  6. python网络编程—Socket

    一.Socket是什么? socket:简称套接字,是进程间通讯的一种方式,他与其他进程间通讯的一个主要不同是:它能实现不同主机间进程间通讯,我们网络上各种各样的服务大多是基于Socket来完成通讯的 ...

  7. python 网络编程--socket模块/struct模块

    socket模块: 客户端:CS架构,  client -> server 浏览器:BS架构,  browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...

  8. Day8 - Python网络编程 Socket编程 --转自金角大王

    本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实 ...

  9. python 网络编程 socket 报错 ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

    服务端: # -*- coding: utf-8 -*- """ @File : 191226_基于UDP协议的socket_server端.py @Time : 201 ...

  10. Python网络编程——socket套接字实现UDP/TCP信息传输

    socket套接字 socket(简称 套接字) ,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来 ...

最新文章

  1. JS:1.2,控制语句(if,if else,for,switch,while,do while)
  2. 显示网格_快速制图软件 Edraw Max教程:Edraw Max怎么显示出网格线?
  3. ASP.NET的错误处理机制之二(实例log4net)
  4. JavaSE(十三)——Swing
  5. 利用JPEG制作更快,更准确的神经网络
  6. python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量
  7. python实验练习-图书管理系统(使用文件来实现)
  8. dv算法java实现_各种排序算法的分析及java实现(二)
  9. java collections读书笔记(3) vector(2)
  10. (oracle)八、表
  11. iOS 乱码问题之一
  12. 最强的优化器:把RAdam和LookAhead协同组合
  13. python计算等额本金_等额本金还款计算公式
  14. 海马汽车经销商管理系统技术解析(四)保养管理
  15. (2) python--pandas
  16. 太厉害了,阿里大牛把Java服务端做成一张超全的知识微缩地图
  17. Think twice, code once.
  18. java微信个人订阅号发信息_微信个人公众号开发-java
  19. 基于abaqus的各向异性材料的抗拔力学性能分析
  20. 大数据周周看:前英特尔高管加入谷歌云部门,网易与威马汽车合作打造“互联网+”时代智能汽车

热门文章

  1. Linux系统下 Apache+PHP 环境安装搭建
  2. 固定顶部指定div不滑动
  3. java中List Array相互转换
  4. YTU 2586: 填空题B-字画鉴别
  5. java字符串的课后作业
  6. Mac MacBook Pro的移动硬盘方案
  7. 删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
  8. C#下把txt文件数据读进sql server中存储所遇到的乱码问题
  9. 有时候,爱就是那么简单
  10. 配置Memcache服务器并实现主从复制功能(repcached)