zoukankan      html  css  js  c++  java
  • 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()

    运行效果:

    这是服务器的打印结果。

    客户端:

  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/8660744.html
Copyright © 2011-2022 走看看