ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python使用socket搭建TCP服务器(后期的客户端:GPRS模块)

2021-05-09 22:03:22  阅读:198  来源: 互联网

标签:GPRS info socket Python TCP server 接字 客户端


socket模块

其实不只是Python,例如C#,Java等都会有这个模块

百度百科:socket是一种操作系统提供的进程间通信机制。[1] 在操作系统中,通常会为应用程序提供一 组应用程序接口(API),称为套接字接口(英语:socket API)。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。最早的套接字接口来自于4.2 BSD,因此现代常见的套接字接口大多源自Berkeley套接字(Berkeley sockets)标准。在套接字接口中,以IP地址及通信端口组成套接字地址(socket address)。远程的套接字地址,以及本地的套接字地址完成连线后,再加上使用的协议(protocol),这个五元组(five-element tuple),作为套接字对(socket pairs),之后就可以彼此交换数据。例如,在同一台计算机上,TCP协议与UDP协议可以同时使用相同的port而互不干扰。
操作系统根据套接字地址,可以决定应该将数据送达特定的行程或线程。这就像是电话系统中,以电话号码加上分机号码,来决定通话对象一般。

概念太复杂,只需记住这个Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。是用来写网络编程的,比如说TCP,UDP通信,新手入门的话一般都是用写两个Py文件,一个是服务器(server),一个是客户端(可以写多个客户端,一起和server通信)

UDP和TCP对比

TCP:安全,在进行通信之前必须先建立一个连接,该连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这种类型的通信也称为虚拟电路或流套接字。

UDP:不安全,与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。
在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。

代码

server

首先是用socket创一个对象
参数:SOCK_DGRAM
AF_INET:面向网络的套接字,一般写用这个,除此之外还有一个套接字是面向文件的–>AF_UNIX
SOCK_STREAM:TCP套接字(固定的) 如果写的是UDP则用:

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
ddress='127.0.0.1'     #127.0.0.1是监听本机
port=12345             #监听自己的哪个端口
buffsize=1024          #接收从客户端发来的数据的缓存区大小

服务器代码

   server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(("0.0.0.0", 9001))
    server.listen()
    conn, addr = server.accept()
    while True:
        # info = input('>>>')  # 输入数据,编码并发送给客户端
        # info = info.encode('utf-8')
        # conn.send(info)
        c_info = conn.recv(5120).decode('utf-8')  # 接受客户端消息并解码
        if len(c_info)>0:
            print(c_info)
        #conn.send(data="I am server,message is dealing")

    conn.close()
    server.close()

我使用的host是 0.0.0.0,可以实现任意连接
(在这里写的都是单向通信,也就是客户端向服务器发送数据)

client

import socket


if __name__ == '__main__':
    # 获取本机计算机名称
    hostname = socket.gethostname()
    # 获取本机ip
    ip = socket.gethostbyname(hostname)
    #client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client  = socket.socket()
    client.connect((ip, 9001))
    while True:
        info = input('>>>')  # 输入数据,编码并发送给服务端
        info = info.encode('utf-8')
        client.send(info)
        s_info = client.recv(1024)  # 接受服务端的消息并解码
        s_info = s_info.decode(encoding='utf-8')
        print(s_info)
        if s_info == 'bye':  # 如果服务端发送的消息为bye,回复bye,结束循环
            client.send(b'bye')
            print('bye_1')
            break

    client.close()

(另外一个角度来说,也可以用现成的网络调试助手来向写好的TCP服务器发数据)

最后面把server的代码跑在Linux系统上,也可以接受任意电脑(客户端)发来的数据
后期的话就把GPRS写成一个TCP的客户端,就可以实现硬件跟服务器通信

后面的话就是解决一些多个客户端对服务器发数据,在服务器那里将数据识别,分出数据来自哪个下位机,分清楚之后就开始对数据进行一个检验和存入数据库的操作。

标签:GPRS,info,socket,Python,TCP,server,接字,客户端
来源: https://blog.51cto.com/u_15195370/2764055

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有