文章目录
一、Socket概述
1、概念
- Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
- socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
- socket和file的区别:
- file模块是针对某个指定文件进行【打开】【读写】【关闭】
- socket模块是针对服务器端和客户端Socket 进行【打开】【读写】【关闭】
2、注意点
- 客户端:
socket通信时,需要使用到ip+端口号的形式,客户端往服务器端发送请求时,会带一个随机的端口号进行请求;- 服务器端:
listen(0.0.0.0, 6969)代表监听所有网卡(ip)的6969端口,当前也可以写具体网卡ip;
3、Socket Families(地址簇)
These constants represent the address (and protocol) families, used for the first argument to socket(). If the AF_UNIX constant is not defined then this protocol is unsupported. More constants may be available depending on the system.
地址簇种类:
- socket.AF_UNIX unix本机进程间通信
- socket.AF_INET IPV4
- socket.AF_INET6 IPV6
4、Socket Types
These constants represent the socket types, used for the second argument to socket(). More constants may be available depending on the system. (Only SOCK_STREAM and SOCK_DGRAM appear to be generally useful.)
- socket.SOCK_STREAM # for tcp
- socket.SOCK_DGRAM # for udp
- socket.SOCK_RAW # 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
- socket.SOCK_RDM # 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
- socket.SOCK_SEQPACKET # 废弃了
二、Socket通信案例
1. 一个服务器端一个客户端_单次收发模型
1. 服务器端
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Mason
import socket
# 声明socket类型, 同时生成socket连接对象, 默认为ipv4, tcp协议类型
server = socket.socket()
# 绑定要监听端口
server.bind(("localhost", 6969))
# 开始监听
server.listen()
# 等待客户端请求
# conn就是客户端连过来, 在服务器端为其生成的连接实例
conn, addr = server.accept()
# 可以看到客户端连过来时, 会随机生成一个端口号, 进行连接
print("CONN:{conn}\nADDR:{addr}".format(<