Python学习日记-第三十天-tcp(服务器端)

系列文章目录

  • tcp服务器端


完成tcp服务器功能,需要的流程如下:

  1. socket创建一个套接字
  2. bind绑定ip和port
  3. listen使套接字变为可以被动链接
  4. accept等待客户端的链接
  5. Recv/send接收发送数据

(注:服务器都是要绑定端口的,要先固定端口)

操作:

第一个套接字是服务器用来监听的,只负责接收消息,在它接收到客户端的数据后,它的使命就完成了,只需要等待下一个客户端发送数据过来就行。第二个套接字才是服务器回复使用的,如果有多个用户,就还会有第三个套接字,第四个套接字来回复数据。但是第一个套接字始终只用来接收客户端的数据。

所以在我们运行的程序的时候会堵塞

要解堵的话,就需要在服务器端回一下消息即可 

 

 代码:

import socket


def main():
    # 1. 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 绑定本地信息 bind
    tcp_server_socket.bind(("", 7890))

    # 3 .让默认的套接字有主动变为被动 listen,这样就可以接收别人的数据了
    tcp_server_socket.listen(128)
    print("----1----")

    # 4. 等待客户端链接 accept
    # new_client_socket用来为这个客户端服务
    # tcp_server_socket就可以省下来专门等待其他客户端的链接
    new_client_socket, client_addr = tcp_server_socket.accept()
    print("---2---")
    print(client_addr)

    #  接收对方发送过来的数据
    recv_data = new_client_socket.recv(1024)
    # 接收1024个字节
    print("接收到的数据为:", recv_data.decode("utf-8"))

    # 回送一些数据给客户端
    new_client_socket.send("thank you ".encode("utf-8"))

    new_client_socket.close()
    tcp_server_socket.close()


if __name__ == "__main__":
main()

小结:在运行的时候,都是服务器先运行,先有服务器,才会有客户来访问,上面服务器之所以会堵塞,是因为服务器要先等客户端发送数据,客户端才能回复数据,就好比我们平时登录QQ,都是我们先输入账号密码,点击登录,等待服务器回复,我们才能成功登录


下面介绍一下服务器循环为多个用户端服务:

操作:

在这里添加一个while循环,这里tcp_server_socket必须要放在循环外,上面说过,这个套接字是负责监听的,用来循环为多个客户端服务 

可以同时开通两个网络调试助手的窗口进行练习操作: 

控制台接收消息:


版权声明:本文为arizia原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。