Socket简介
Sccket的英文原意是“孔”或者“插座”。作为BSD UNIX的进程通信机制,取最后一种意思,通常也称“套接字”,用于描述IP地址和端口,是一个通讯链的句柄,可以用来实现不同虚拟机或者不同计算机的通信。
Sccket本事是编程接口(API)对于TCP/IP的封装,TCP/IP也要提供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式,Socket是发动机,提供了网络通信的能力。
套接字之间连接过程可分为三个步骤:服务器监听,客户端请求,连接确认。
创建Socket
import socket
socket.socket(AddressFamliy,Type)
该函数创建一个socket,返回该socket的描述符。
AddressFamily:可选择AF_INET(用于Internet进程间通信)或者AF_UNIX(用于同一台机器进程间通信),实际工作中多用AF_INET。
Type:套接字类型,可是SOCK_STREAM(流式套接字,主要用于TCP协议)或者SOCK_DGRRAM(数据套接字,主要用于UDP协议)。
- UDP(User Data Protocol,用户数据报协议)是一个无连接的简单数据报的传输层协议,不提供可靠性,没有超市重发等机制,故传输速度快,一般用于多点通信和实时数据业务,比如SNMP,RIP,DNS。
- TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,在发送数据前,必须和对方建立可靠的连接,一个TCP连接必须经过三次“对话”才能建立起来。
简单的UDP发送接收信息
1 #encoding=utf-8
2 from socket import *
3 #创建套接字
4 udpSocket = socket(AF_INET,SOCK_DGRAM)
5 #准备数据接收方地址
6 sendAddr = ("192.168.9.1",8080)
7 #从键盘获取数据
8 sendData = input("请输入要发送的内容:")
9 sendData = bytes(sendData,encoding="utf-8")
10 #发送数据到指定电脑
11 udpSocket.sendto(sendData,sendAddr)
12 #等待接收方发送的信息
13 receData = udpSocket.recvfrom(1024)#1024表示接收的最大字节数
14 print (receData)
15 #关闭套接字
16 udpSocket.close()
绑定地址和端口
1 #encoding=utf-8
2 from socket import *
3 #创建套接字
4 udpSocket = socket(AF_INET,SOCK_DGRAM)
5 #绑定本地相关信息,如果网络程序不绑定,系统会随机分配
6 #IP一般不写,表示本机任何一个IP
7 bindAddr = ("",7788)
8 udpSocket.bind(bindAddr)
9 #准备数据接收方地址
10 receData = udpSocket.recvfrom(1024)#1024表示接收的最大字节数
11 print (receData)
12 #关闭套接字
13 udpSocket.close()
echo服务器
#encoding=utf-8
from socket import *
#创建套接字
udpSocket = socket(AF_INET,SOCK_DGRAM)
#绑定本地相关信息,如果网络程序不绑定,系统会随机分配
#IP一般不写,表示本机任何一个IP
bindAddr = ("",9999)
udpSocket.bind(bindAddr)
num = 1
while True:
#等待接收方发送的信息
receData = udpSocket.recvfrom(1024)#1024表示接收的最大字节数
udpSocket.sendto(receData[0],receData[1])
print ("第%s条信息,信息为:%s"%(num,receData[0]))
num +=1
#关闭套接字
udpSocket.close()
UDP聊天室
#encoding=utf-8
from socket import *
import time
#创建套接字
udpSocket = socket(AF_INET,SOCK_DGRAM)
#绑定本地相关信息,如果网络程序不绑定,系统会随机分配
#IP一般不写,表示本机任何一个IP
bindAddr = ("",10000)
udpSocket.bind(bindAddr)
while True:
#等待接收方发送的信息
receData = udpSocket.recvfrom(1024)#1024表示接收的最大字节数
print ("%s:%s"%(time.ctime(),receData[0]))
#关闭套接字
udpSocket.close()