对于刚刚学习计算机网络:自顶向下的同学们,在观看了中科大的视频---TCP Socket以及UDP
Socket会感到些许疑惑,不过没事,在这篇小文章将会为你解开Socket的神秘面纱
什么是Socket?:
Socket 是一套用于不同主机之间通信的API,工作在TCP/IP协议栈之上(传输层)。
socket在牛津字典里译为---插座,插孔。 我们称呼的时候叫它套接字,但是去理解它的时候可以以这个插座,插孔来思考。
比如说,将小明的主机,比作电冰箱,而服务器主机比作插座;那么电冰箱要同电就需要插头(socket)将插座之间连接在一起,那么它们是不是就是实现了通电,类比的想,socket就是相当于小明的主机和服务器之间的那个socket,通过socket进行数据传输,这里的数据就相当于插座提供电---提供服务。 它们之间通过socket(套接字)相互交换数据。
怎么实现Socket
其实socket并不是一个新的事物,它只是一个对ip地址和port统一在一起的抽象概念。
IP地址用于唯一标志我们自己的网络设备 ---联想生活中寄快递(发件人地址,收件人地址)
端口用于区分主机上的不同应用 (发什么快递,到哪个驿站)
我们现在讲的是建立在 C/S模式架构的---TCP连接
具体的socket实现
首先我们来看看具体的服务端(server) 以及 客户端(client)的流程图
我们使用python具体实现socket,其他的主流语言也有socket。
对于服务端server
简易版
#现在是对于sever端的具体实现
#引入套接字库
import socket
#创建服务端函数
def server():
#创建套接字
s = socket.socket()
host = "127.0.0.1" #这个为本地IP地址
port = 6666
#绑定套接字
s.bind((host,port))
#监听
s.listen(5)
#接收&处理套接字
while True:
#接收报文
c, addr = s.appect()#接收客户端的连接 返回一个socket c 以及 客户端地址
#回传报文
print('Connect Addr', addr)
#关闭服务端
c.close()
if __name__ == '__main__':
server()
客户端Client(简易版)
#客户端client 创建
import socket
def client(i):
#创建套接字
s = socket.socket()
#连接套接字
s.connect(('127.0.0.1',6666)) #这里连接的是服务端的套接字{ip,port}
#recv 指定接收长度
print("REcv mas:%s, client:%d"%(c.recv(1024),i))
s.close()
if __name__ == '__main__':
for i in range(10):
client(i)
以及还有复杂版的TCP编程:基于数据流的协议,发送出的数据会按顺序,完整的接收到
要求为C/S模式
要求:服务器原封不动回传客户端发来的信息
服务器端
import socket
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
#AF_INET 代表我们使用的是 IPv4家族
#SOCK_STREAM 代表TCP协议 流式协议
s.bind(('0.0.0.0',1234))
#参数一代表主机上的任意网卡都可以使用这个socket进行通信
s.listen() #设置为监听状态,等待客户端连接
c, addr = s.appect()
#接收任意客户端连接 ,返回新socket c 和 地址 建立起连接
with c:
print(addr,"Conncetted")
while True:
data = c.recv(1024) #不断接收客户传来的数据 一次最大接收量为1024字节
if not data:
break
c.sendall(data) #原封不断回传客户端
客户端:
import sokcet
#使用同样的方法创建socket
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.conncet(('127.0.0.1',1234))
s.sendall(b"HELLO,ROSS") #发送信息给服务器
#注意:这里的参数是字节序列,不是字符串,所以前面要加上一个b
data = s.recv(1024) #接收服务器的消息
print("Received",repr(data))
#基本上就实现了所有操作
Tips:
1.对于这个服务器,它只能同时处理一个客户端的请求
2.with是python中的语法糖,它单纯代表当代码离开with块的时候,自动调用s.close()来销毁这个socket
最后:TCP给你报信还要等你的回话,而UDP说完话就走,不管你在不在