socket编程学习(使用python完成服务器与客户端点对点通信)

发布于:2022-10-30 ⋅ 阅读:(306) ⋅ 点赞:(0)

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)/~、评论(▽)!


网站公告

今日签到

点亮在社区的每一天
去签到