Python简单的网络编程

  • 计算机网络:是多台独立自主的计算机形成的一个系统。
    连接起来的目的是计算机之间共享资源。
    使用TCP(能做到数据不传丢、流量控制、拥塞控制)/ICP连接起来的叫互联网。
#  创建一个无功能的服务器
from socket import socket, AF_INET, SOCK_STREAM
# SOCK_STREAM使用tcp,SOCK_DGRAM使用udp


def main():
    # 创建一个基于TCP协议的套接字对象
    # 因为我们做的是应用级的服务/产品,所以可以利用现有的传输服务来实现数据传输
    server = socket()  # AF_INET, SOCK_STREAM IPv4联网,只能这么写
    # 绑定IP地址(网络上主机的身份标识)和端口(用来区分不同服务的IP 地址的扩展,一个端口对应一个服务)(端口不是一个设备)
    server.bind(('10.7.189.75', 6543))  # ip写成localhost表示本地,6543表示端口号
    # 开始监听客户端的连接
    server.listen(512)  # 512表示队列大小
    print('服务器已经启动正在监听...')
    while True:
        # 通过accept方法接收客户端的连接
        # accept方法是一个阻塞式的方法,如果没有客户端连上来
        # 那么accept方法就会让代码阻塞,知道有客户端连接成功才返回
        # accept方法返回一个元组,元组中的第一个值代表客户端的对象
        # 元组中的第二个值又是一个元组,其中有客户端的IP地址和客户端的端口
        # client = server.accept()
        # print(client)
        client, addr = server.accept()
        print(addr, '连接成功.')
        client.send('hello789'.encode('utf-8'))
        client.close()


if __name__ == '__main__':
    main()

模拟一个聊天服务器

from socket import socket
from threading import Thread

# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol


def main():
    class ClientHandler(Thread):

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):
            while True:
                try:
                    data = self._client.recv(1024)  # 返回的是二进制数据
                    for client in clients:
                        # if client != self._client  不给自己转发消息
                        client.send(data)  # 转发消息
                    if data.decode('utf-8') == 'byebye':
                        clients.remove(self._client)
                        self._client.close()  # 与说‘byebye’的客户端断开连接
                        break
                except Exception as e:  # 获取异常消息
                    print(e)  # 打印异常消息
                    clients.remove(self._client)  # 移除异常客户端
                    break

    server = socket()
    # 这里可以使用Python命令行参数 - sys.argv
    server.bind(('10.7.189.75', 54321))  # 端口号不要跟敏感号重复,建议取1025-65536区间
    # 开始监听
    server.listen(512)
    clients = []
    while True:
        # 接收用户请求
        client, addr = server.accept()
        clients.append(client)
        ClientHandler(client).start()


if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章