python高级编程——网络编程(三)

系统 504 0

TCP和并发服务器

与UDP不同的是,他是一个面向连接的,可靠的数据传输协议

TCP通信比较复杂

先写一个TCP服务器,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、服务器一般是需要一个固定的IP地址和固定端口号,服务器就要绑定这个IP地址和端口号:bind()

3、客户端连接服务器是是有一定的数量(允许最大连接数)的,而这个数量是服务器设定的:listen()

4、上面3步是做被连接的准备,这一步是来接受客户端的数据,在接受数据之前,服务器还是需要接受客户端的socket套接字和IP地址:accept()

5、只有服务器和客户端绑定相同的IP地址,服务器和客户端才可以互相接收数据和发送数据,常理来想,服务器是一只被开启的,也是一直接受数据,所以在接受数据的过程中,我们需要无限循环:recv()

6、如果我们要发送数据给客户端,客户端也需要绑定上面的地址,然后需要调用相应的函数send()

            
              import
            
            
               socket



            
            
              #
            
            
               TCP
            
            
              
#
            
            
               创建一个服务器socket套接字
            
            
server_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            
            
              #
            
            
               服务器的IP地址和端口号
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )

            
            
              #
            
            
               服务器绑定地址
            
            
              server_socket.bind(address)

            
            
              #
            
            
               设置服务器的最大连接数
            
            
server_socket.listen(1
            
              )

            
            
              #
            
            
               创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
            
            
client_socket, address =
            
               server_socket.accept()

            
            
              #
            
            
               服务器需要不停的接受客户端的发来的数据
            
            
              while
            
            
               True:
    
            
            
              """
            
            
              
    以防客户端连接失败,需要检测异常
    无论是接受数据还是发送数据,我们需要将数据统一编码和解码
    
            
            
              """
            
            
              try
            
            
              :
        data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
        
            
            
              #
            
            
               数据处理
            
            
              print
            
            (
            
              "
            
            
              服务器接受的数据:
            
            
              "
            
            
              , data)   # 服务器接受的数据:我是一个客户端
        client_socket.send(
            
            
              "
            
            
              我是一个服务器
            
            
              "
            
            .encode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))
    
            
            
              except
            
            
              :
        
            
            
              break
            
          

再写一个TCP客户端,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、客户端一般是不需要一个固定的IP地址和固定端口号,连接服务器的时候系统会自动分配端口号

3、客户端连接服务器必须先知道服务器的IP地址和端口号,然后在连接服务器:connect()

4、上面3步是做连接的准备,这一步是来发送客户端的数据:send()

5、客户端也可以一直接受服务器发来的数据,所以在接受数据的过程中,我们需要无限循环:recv()

            
              import
            
            
               socket


            
            
              #
            
            
               客户端需要创建一个套接字
            
            
client_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)


            
            
              #
            
            
               客户端需要连接服务器,必须先知道服务器的IP地址和端口号
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )


            
            
              #
            
            
               连接服务器
            
            
              client_socket.connect(address)


            
            
              #
            
            
               这个数据是将要发送的数据
            
            
data = 
            
              "
            
            
              我是一个客户端
            
            
              "
            
            
              
client_socket.send(data.encode(
            
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))

            
            
              while
            
            
               True:
    
            
            
              """
            
            
              
    以防服务器中断退出,需要检测异常
    无论是接受数据还是发送数据,我们需要将数据统一编码和解码
    
            
            
              """
            
            
              try
            
            
              :
        data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
        
            
            
              #
            
            
               数据处理,这里打印出来并且将数据发回客户端
            
            
              print
            
            (
            
              "
            
            
              客户端接受的数据:
            
            
              "
            
            
              , data)
    
            
            
              except
            
            
              :
        
            
            
              break
            
          

 并发服务器,这里我只介绍多线程服务器,进程和线程是差不多的)

  在TCP服务器的原有基础上增加一个线程,再将监听数增加为5,就可以允许5个客户端线程同时访问,并且可同时发送和接受数据

            
              import
            
            
               socket

            
            
              from
            
             threading 
            
              import
            
            
               Thread



            
            
              #
            
            
               TCP
            
            
              
#
            
            
               创建一个服务器socket套接字
            
            
server_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            
            
              #
            
            
               服务器的IP地址和端口号
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )



            
            
              def
            
            
               net_connect():
    
            
            
              try
            
            
              :
        
            
            
              #
            
            
               服务器绑定地址
            
            
                      server_socket.bind(address)
        
            
            
              #
            
            
               设置服务器的最大连接数
            
            
        server_socket.listen(5
            
              )
    
            
            
              except
            
            
              :
        
            
            
              return
            
            
              #
            
            
               创建线程
            
            
    th = Thread(target=
            
              recv_data)
    th.start()



            
            
              def
            
            
               recv_data():
    
            
            
              #
            
            
               服务器需要不停的接受客户端的发来的数据
            
            
              while
            
            
               True:
        
            
            
              """
            
            
              
        以防客户端连接失败,需要检测异常
        无论是接受数据还是发送数据,我们需要将数据统一编码和解码
        
            
            
              """
            
            
              #
            
            
               创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
            
            
        client_socket, address =
            
               server_socket.accept()
            
            
              try
            
            
              :
            data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
            
            
            
              #
            
            
               数据处理
            
            
              print
            
            (
            
              "
            
            
              服务器接受的数据:
            
            
              "
            
            
              , data)
            client_socket.send(
            
            
              "
            
            
              我是一个服务器
            
            
              "
            
            .encode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))
        
            
            
              except
            
            
              :
            
            
            
              break
            
            
              


net_connect()
            
          

 

在TCP客户端上也增加一个线程,然后同时运行多次这个客户端程序:

            
              import
            
            
               socket


            
            
              #
            
            
               客户端需要创建一个套接字
            
            
              from
            
             threading 
            
              import
            
            
               Thread

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


            
            
              #
            
            
               客户端需要连接服务器,必须先知道服务器的IP地址和端口号
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )



            
            
              def
            
            
               net_connect():
    
            
            
              try
            
            
              :
        
            
            
              #
            
            
               连接服务器
            
            
                      client_socket.connect(address)
    
            
            
              except
            
            
              :
        
            
            
              return
            
            
              
    th 
            
            = Thread(target=
            
              recv_data)
    
            
            
              #
            
            
               th.setDaemon(True)
            
            
                  th.start()



            
            
              def
            
            
               recv_data():
    
            
            
              #
            
            
               这个数据是将要发送的数据
            
            
    data = 
            
              "
            
            
              我是一个客户端
            
            
              "
            
            
              
    client_socket.send(data.encode(
            
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))

    
            
            
              while
            
            
               True:
        
            
            
              """
            
            
              
        以防服务器中断退出,需要检测异常
        无论是接受数据还是发送数据,我们需要将数据统一编码和解码
        
            
            
              """
            
            
              try
            
            
              :
            data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
            
            
            
              #
            
            
               数据处理,这里打印出来并且将数据发回客户端
            
            
              print
            
            (
            
              "
            
            
              客户端接受的数据:
            
            
              "
            
            
              , data)
        
            
            
              except
            
            
              :
            
            
            
              break
            
            
              


net_connect()
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论