• python3+socket搭建简易服务器


    踩了一上午的坑之后,终于对网络编程有了一点大致的、基本的了解。真的是0基础,之前对socket网络编程一点都不知道。(感觉自己与时代脱轨。。。。)

    首先我想对这些美妙的专业术语进行一番搜索:

    服务器:简而言之,它是一个位于一个物理服务器上的网络服务器(呀,服务器上的服务器),它等待客户端发送请求。当它接收到一个请求,就会生成一个响应并回发给客户端。客户端和服务器使用HTTP协议通信。客户端可以是浏览器或者别的使用HTTP协议的软件。-----------------------伯乐在线

     套接字:TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)。-------------------------百度

    表示如果把服务器和客户端比作一对情侣的话,那么套接字就是他们相互拥抱的双手。

    TCP?HTTP?:HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议。包括:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议。

    TCP/IP :他是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

    socket:实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。---------------------------------http://www.cnblogs.com/shangdahao/archive/2013/05/22/3085131.html?share_from=com.rae.cnblogs

    利用Socket建立网络连接的步骤:

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

    2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

    3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

     (我是盗图小能手)

    好了,了解了一些可能会用到的术语,下面看看一个用python搭建的简易服务器是长什么样的:

    #coding: utf-8
    
    """
    搭建简单服务器
    """
    
    import socket
    
    HOST = '10.130.167.108'     #获取本地主机名,cmd下用ipconfig命令查看
    PORT = 12345                #设置端口号
    ADDR = (HOST,PORT)      #放在一起就是套接字了
    
    web = socket.socket()       #创建socket对象
    web.bind(ADDR)              #绑定端口
    
    web.listen(5)               #等待客户端连接,参数为TCP连接队列的大小,就是连接数
    print('sever is listening...')
    
    while True:
        client_connection,client_address = web.accept()  #建立客户端连接
        print('link addr:')
        print(client_address)   #打印客户端发来的嵌套字
    
        client_connection.send(str.encode("HELLO,WORLD"))   #向客户端发送信息,需要byte类型的参数,需要做一下转换
    
        data = client_connection.recv(1024)
        print(data)
    
        client_connection.close()       #关闭连接

    其中 listen 函数会监听连接到socket上的连接,参数表示在拒绝连接之前系统可以挂起的最大连接队列数量为5。这些连接还没有被accept处理。数量不能无限大,通常指定5。一旦我们监听到了连接,就会调用  accept 函数接收连接 。

    accept 函数返回一个二元组,client_connection  是一个新的socket对象,用来接收和发送数据。client_address  表示另一端的socket地址。

    我们打印出客户端的套接字后,紧接着向客户端发送信息,这里发送的时候,注意一下我用的python3.6,里面的字符编码的格式问题。

    发送完信息之后,我们等待接收客户端发送来的信息并显示。然后关闭连接,一个循环结束。进入下一个循环。

    客户端的程序:

    """
    简易客户端
    """
    
    import socket
    
    HOST = '10.130.167.108'     #获取本地主机名
    PORT = 12345                #设置端口号
    ADDR = (HOST,PORT)
    
    web = socket.socket()
    
    web.connect(ADDR)           #请求与服务器建立连接
    web.send(str.encode("this is client..."))   #向服务器发送信息
    
    data = web.recv(1024)       #接收数据
    print(data)                 #打印出接受到的数据
    
    web.close()

    运行效果:

    这是服务器的打印结果。

    客户端:

  • 相关阅读:
    AGC002
    ICPC 北美Mid Central 2019 Regional
    【洛谷 5020】货币系统
    【洛谷 1109】学生分组
    【洛谷 2915】奶牛混合起来
    【洛谷 4162】最长距离
    【YCOJ 3805】竞选
    【洛谷 2807】最长路
    【洛谷 2918】买干草Buying Hay
    【LOJ 10172】涂抹果酱
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/8660744.html
Copyright © 2020-2023  润新知