博客
关于我
学Python记笔记_网络编程——Socket库_套接字
阅读量:794 次
发布时间:2019-03-25

本文共 4085 字,大约阅读时间需要 13 分钟。

What is a Socket?

我们生活在一个充满了信息的时代,计算机技术的发展使得信息的交换变得更加便捷。Socket作为网络通信中最基本的概念之一,正是实现这一愿景的关键。那么,socket到底是什么?让我们从基础开始探索。

Socket是什么?

一个socket实际上是网络中进程间进行双向通信的端点。它是将应用程序与网络协议连接起来的桥梁。简单来说,socket就像是一张门票,允许不同主机上的应用程序进行信息交流。而且,socket的定义确实直观:它代表了一块位于内存中的数据抽象,通过它,数据可以在网络中实现交换。就像插头和插座一样,socket为数据的传输提供了连接点,port(端口)则相当于连接数据流的电缆。理解socket的本质,是理解网络通信的基础。

socket的类型

socket在实际应用中并非一成不变,它具有多种类型,满足不同的通信需求。主要有以下三种常见类型:

1. 流套接字 (SOCK_STREAM)流套接字基于TCP协议,它具有可靠的数据传输特性。数据会以顺序的方式准确无误地交换。这类socket适用于需要稳定连接并按顺序处理数据的场景。

2. 数据报套接字 (SOCK_DGRAM)数据报套接字使用UDP协议,传输速度快,但无连接性保障。数据报适用于实时性要求高但不牵涉到连接建立的场景,例如视频流或实时音频。

3. 原始套接字 (SOCK_RAW)原始套接字允许直接处理未经处理的数据包,无论是TCP、UDP还是其他协议。这类socket通常用于低层协议开发或跨协议通信场景。

理解这些类型的区别,能够帮助你在实际项目中做出更合适的选择。

socket in Python

在Python中,socket模块为程序提供了强大的网络通信能力。socket()函数是创建套接字的入口。让我们详细了解一下。

创建socket

socket的创建非常简单:

import socket

socket.socket(family, type, proto)

三个参数的意义:

  • family:指定套接字的家族。常用的有 socket.AF_UNIX(本地)或 socket.AF_INET(IPv4)或 socket.AF_INET6(IPv6)。
  • type:指定套接字类型,如 socket.SOCK_STREAM(流套接字)或 socket.SOCK_DGRAM(数据报套接字)。
  • proto:指定传输协议,默认省略即为TCP+IPv4。

通过默认设置,程序可以直接创建标准套接字。


socket对象的方法

socket对象可用于进行各种通信操作。服务器端和客户端各有特定的方法,以下是它们的简要说明。

服务器端方法

  • bind():将套接字绑定到指定地址。
  • listen():设置监听大小并开始接受连接。
  • accept():等待连接请求并返回新连接的数据包。

客户端方法

  • connect():连接到指定服务器。
  • connect_ex():类似connect(),但返回错误码以供处理。

}}>...


优化后的文章可直接复制使用:

What is a Socket?

在计算机科学中,socket 是实现网络通信的核心概念。它作为网络中进程间通信的端点,统一了应用程序与网络协议的连接。socket 的性质可以用插头和插座来类比:它为数据交换提供了连接点,而端口则相当于连接数据流的“电缆”。理解socket 的本质,是掌握网络通信的基础。

socket 的类型

socket 并非固定不变,它具有多种类型,满足不同的通信需求。以下是主要的socket类型:

1. 流套接字 (SOCK_STREAM)

流套接字是基于TCP协议的socket类型。其独特之处在于,数据传输具有可靠性和有序性。TCP协议会确保数据包按顺序到达目的地,无差错率。这类socket 最适用于需要稳定连接并按步骤处理数据的场景,例如文件传输或远程登录。

2. 数据报套接字 (SOCK_DGRAM)

数据报socket基于UDP协议。它的特点是传输速度快且没有连接性。数据报不会建立长期连接,而是以独立的数据包形式传输。这类socket 被广泛用于实时性要求高但不依赖连接建立的场景,例如多媒体流传输或实时音视频数据传输。

3. 原始套接字 (SOCK_RAW)

原始socket允许处理未经处理的数据包,涵盖TCP、UDP等多种协议。这种类型的socket 适用于对底层协议有更高要求的场景,例如处理自定义网络协议或跨协议通信。

理解这些socket类型的区别,能够帮助你在具体项目中做出更明智的选择。


socket in Python

在Python中,socket 模块提供了丰富的API来实现网络通信。socket() 函数是创建socket的入口。以下是创建socket的简要操作:

创建socket

socket的创建非常简单:

import socketsocket.socket(family, type, proto)

三个参数的意义:

  • family:指定socket家族。常用的值有:

    • socket.AF_UNIX:本地 Unix 套接字。
    • socket.AF_INET:IPv4。
    • socket.AF_INET6:IPv6。
  • type:指定socket类型,如 socket.SOCK_STREAM(流套接字)或 socket.SOCK_DGRAM(数据报套接字)。

  • proto:指定传输协议,默认不指定即为 TCP/IP。

通过默认设置,程序可以创建标准的流套接字。


socket对象的方法

socket对象支持多种操作,以实现不同的通信需求。以下是服务器端和客户端常用的方法:

服务器端方法

  • bind():将socket绑定到指定地址。
  • listen():设置监听队列大小并开始等待连接。
  • accept():接受客户端连接请求,返回新连接的数据包及其来源信息。

客户端方法

  • connect():连接到指定服务器。
  • connect_ex():类似于connect(),但返回连接状态的错误码以供处理。

实际应用示例

TCP通信示例(服务器端)

import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_addr = ("", 14444)  # 绑定到本地所有接口,端口14444server_socket.bind(server_addr)server_socket.listen(5)  # 设置监听队列大小为5print("TCP服务器已启动...")while True:    client_packet, client_addr = server_socket.accept()  # 等待并获取新连接    print(f"来自 {client_addr} 的数据包已接收")    data = client_packet.recv(1024)  # 接收最大1024字节的数据    print(data.decode())  # 解码并查看接收到的内容

TCP通信示例(客户端)

import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_addr = ("127.0.0.1", 14444)  # 指定本地服务器和端口try:    client_socket.connect(client_addr)    print("连接到服务器...")        message = "Hello, World!"    client_socket.send(message.encode())  # 发送编码后的消息    print("已发送消息:" + message)    finally:    client_socket.close()  # 关闭socket连接

UDP通信示例(服务器端)

import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_addr = ("", 14444)  # 绑定到本地所有接口,端口14444server_socket.bind(server_addr)print("UDP服务器已启动...")while True:    data, client_addr = server_socket.recvfrom(1024)  # 接收最大1024字节的数据    print(f"来自 {client_addr} 的数据包:{data.decode()}")

UDP通信示例(客户端)

import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)client_addr = ("127.0.0.1", 14444)  # 指定本地服务器和端口try:    message = "Hello, World!"    client_socket.sendto(message.encode(), client_addr)    print("已发送消息:" + message)    finally:    client_socket.close()  # 关闭socket连接

这就是socket在Python中的应用示例。从简单的TCP/UDP通信到实际项目中的组合使用,socket为程序提供了灵活的网络通信工具。理解socket的原理和使用方法,是成为一名熟练开发者的基础。更多socket功能和应用案例,欢迎在评论区分享!

转载地址:http://wspuk.baihongyu.com/

你可能感兴趣的文章
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>