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

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

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,关于Python Socket服务器,以下是一些基本的学习笔记: 1. 创建Socket服务器 使用Python中的`socket`模块创建Socket服务器,可以使用`socket()`函数来创建一个Socket对象,如下所示: ```python import socket # 创建一个Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中,第一个参数`AF_INET`表示使用IPv4地址族,第二个参数`SOCK_STREAM`表示使用TCP协议,如果使用UDP协议,则应该使用`SOCK_DGRAM`。 2. 绑定Socket服务器 在创建Socket对象之后,需要使用`bind()`方法将Socket对象和一个IP地址及端口号绑定在一起,如下所示: ```python # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8888)) ``` 其中,`bind()`方法的参数是一个元组,第一个元素是IP地址,第二个元素是端口号。 3. 监听Socket服务器 在绑定IP地址和端口号之后,需要使用`listen()`方法开始监听Socket服务器,如下所示: ```python # 开始监听 server_socket.listen(5) ``` 其中,`listen()`方法的参数表示最大连接数,即同时可以连接的客户端数量。 4. 接受客户端连接 当有客户端连接到Socket服务器时,需要使用`accept()`方法来接受客户端连接,如下所示: ```python # 接受客户端连接 client_socket, client_address = server_socket.accept() ``` 其中,`accept()`方法返回一个元组,第一个元素是客户端Socket对象,第二个元素是客户端的IP地址和端口号。 5. 接收和发送数据 客户端连接到Socket服务器之后,就可以进行数据的接收和发送了,使用`recv()`方法接收客户端发送的数据,使用`send()`方法向客户端发送数据,如下所示: ```python # 接收客户端数据 data = client_socket.recv(1024) # 发送服务器数据 client_socket.send(b'Hello, client!') ``` 其中,`recv()`方法的参数表示接收数据的最大字节数,`send()`方法的参数是要发送的数据,需要将其转换为字节串。 6. 关闭Socket服务器 当与客户端的通信完成后,需要使用`close()`方法关闭Socket服务器,如下所示: ```python # 关闭Socket服务器 server_socket.close() ``` 以上是关于Python Socket服务器的一些基本学习笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuzhu、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值