zoukankan      html  css  js  c++  java
  • python简单网络服务器

    对于服务器来说建立TCP连接的过程分为4步:

    1.建立socket对象:这里与客户端一样,依然是:

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    2.设置和得到socket选项

    python定义了setsockopt()和getsockopt(),一个是设置选项,一个是得到设置。这里主要使用setsockopt(),具体结构如下:

    setsockopt(level,optname,value)

    level定义了哪个选项将被使用。通常情况下是SOL_SOCKET,意思是正在使用的socket选项。它还可以通过设置一个特殊协议号码来设置协议选项,然而对于一个给定的操作系统,大多数协议选项都是明确的,所以为了简便,它们很少用于为移动设备设计的应用程序。

    optname参数提供使用的特殊选项。关于可用选项的设置,会因为操作系统的不同而有少许不同。如果level选定了SOL_SOCKET,那么一些常用的选项见下表:

    选项

    意义

    期望值

    SO_BINDTODEVICE

    可以使socket只在某个特殊的网络接口(网卡)有效。也许不能是移动便携设备

    一个字符串给出设备的名称或者一个空字符串返回默认值

    SO_BROADCAST

    允许广播地址发送和接收信息包。只对UDP有效。如何发送和接收广播信息包

    布尔型整数

    SO_DONTROUTE

    禁止通过路由器和网关往外发送信息包。这主要是为了安全而用在以太网上UDP通信的一种方法。不管目的地址使用什么IP地址,都可以防止数据离开本地网络

    布尔型整数

    SO_KEEPALIVE

    可以使TCP通信的信息包保持连续性。这些信息包可以在没有信息传输的时候,使通信的双方确定连接是保持的

    布尔型整数

    SO_OOBINLINE

    可以把收到的不正常数据看成是正常的数据,也就是说会通过一个标准的对recv()的调用来接收这些数据

    布尔型整数

    SO_REUSEADDR

    当socket关闭后,本地端用于该socket的端口号立刻就可以被重用。通常来说,只有经过系统定义一段时间后,才能被重用。

    布尔型整数

     

    本节在学习时,用到了SO_REUSEADDR选项,具体写法是:

    S.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 这里value设置为1,表示将SO_REUSEADDR标记为TRUE,操作系统会在服务器socket被关闭或服务器进程终止后马上释放该服务器的端口,否则操作系统会保留几分钟该端口。

    3.绑定socket

    绑定即为服务器要求一个端口号。

    S.bind((host,port)),其中host为服务器ip,通常为空,也可以绑定到一个特定的ip地址。Port为端口号。

    4.侦听连接。

    利用listen()函数进行侦听连接。该函数只有一个参数,其指明了在服务器实际处理连接的时候,允许有多少个未决(等待)的连接在队列中等待。作为一个约定,很多人设置为5。如:s.listen(5)

    [python] view plaincopyprint?在CODE上查看代码片派生到我的代码片
     
    1. import socket  
    2.   
    3. host = ''  
    4. port = 80  
    5.   
    6. print "Create socket"  
    7. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    8. print "done"  
    9.   
    10. print "Set the socket options"  
    11. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
    12. print "done"  
    13.   
    14. print "Build to port and interface"  
    15. s.bind((host, port))  
    16. print "done"  
    17.   
    18. print "Listen for connection"  
    19. s.listen(5)  
    20.   
    21. print "Connect from ", s.getsockname() 
  • 相关阅读:
    批量kill session实现脚本
    mysql 5.7.34 gtid 复制模式下执行 reset master 命令后 slave 节点的处理
    修改listener的inbound_connect_timeout参数的方法
    ORA-609 : opiodr aborting process unknown ospid
    mysqldump用法总结
    重置mysql主从同步:reset master和reset slave
    Too many connections
    redisson实现分布式锁(spring整合redisson)
    Caused by: java.lang.ClassNotFoundException: org.springframework.data.util.CloseableIterator
    Caused by: java.lang.ClassNotFoundException: org.springframework.data.keyvalue.core.mapping.context.KeyValueMappingContext
  • 原文地址:https://www.cnblogs.com/hushaojun/p/4595436.html
Copyright © 2011-2022 走看看