socket编程学习
---------------------------------------------------------------------------------------文章开始--------------------------------------------------------------------------------
一、相关网络知识
1 OSI七层模型
七层模型,亦称OSI(Open System Interconnection)。
参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
建议参考 [知乎这篇](https://zhuanlan.zhihu.com/p/473211616)
2 LWIP协议栈
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
3 LWIP与 OSI对比
二、socket接口api
socket():创建socket
bind():绑定socket到本地地址和端口,通常由服务端调用
listen():TCP专用,开启监听模式
accept():TCP专用,服务器等待客户端连接,一般是阻塞态
connect():TCP专用,客户端主动连接服务器
send():TCP专用,发送数据
recv():TCP专用,接收数据
sendto():UDP专用,发送数据到指定的IP地址和端口
recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口
closesocket():关闭socket
接口详解参考 socket接口详解
三、基于python的socket示例
目前只采用了tcp/ip来进行socket编程。
使用python实现了一个点对点的socket通信示例:
1.首先,获取本地的ip进行服务器端创建,服务器端的socket建立,等待客户端连接
2.客户端连接服务器端成功后,创建新的数据接收线程,用于接收客户端的数据,本线程继续保留,用于数据发送
3.客户端则直接进行服务器端的连接,连接成功则创建新的数据接收线程,用于接收服务端的数据,本线程继续保留,用于数据发送
代码如下:
import socket
import threading
def server_rev(*args):
conn = args[0]
while True:
try:
data=conn.recv(1024)
dt=data.decode('utf-8') #接收一个1024字节的数据
print('收到:',dt)
except:
print('interrupt')
conn.close()
#注册服务器
def regsiter_server(ip,port,num):
#创建tcp 流式服务器
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_socket.bind((ip,port))
s_socket.listen(num)
print("注册服务器成功···")
while True:
conn,addr= s_socket.accept()
print(addr)
ctt = threading.Thread(target=server_rev,args=(conn,))
ctt.daemon = True
ctt.start()
while True:
aa=input('服务器发出:')
if aa=='quit':
conn.close() #关闭来自客户端的连接
s_socket.close() #关闭服务器端连接
else:
conn.send(aa.encode('utf-8'))
def regsiter_client(ip,port):
#创建tcp 客户端
c_socket = socket.socket()
try:
print("wait connect···")
c_socket.connect((ip,port)) #建立连接
ctt = threading.Thread(target=server_rev,args=(c_socket,))
ctt.daemon = True
ctt.start()
while True:
ab=input('客户端发出:')
if ab=='quit':
c_socket.close() #关闭客户端连接
else:
c_socket.send(ab.encode('utf-8')) #发送数据
except:
print("no connect···")
link_mode = input("是否创建服务器?y/n \r\n")
link_port = 80
link_maxnum = 12
#服务器列表
link_slist = []
#客户端列表
link_clist = []
#获取本机ip
local_ip = socket.gethostbyname(socket.gethostname())
print("本机ip:"+local_ip)
if (link_mode == "y"):
print("正在注册服务器···")
regsiter_server(local_ip,link_port,link_maxnum)
elif(link_mode == "n"):
print("正在连接服务器···")
regsiter_client(local_ip,link_port)
else:
print("input ERR···")
测试结果:
需要先创建服务端,再创建客户端。
----------------------------------------------------------------------------------到这里就结束了-------------------------------------------------------------------------------
时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!
到这里就结束了,希望大家点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!