Python基于socket实现TCP客户端和服务端

yizhihongxing

以下是“Python基于socket实现TCP客户端和服务端”的完整攻略:

什么是Socket以及TCP/IP协议?

  • Socket:Socket是通信两端建立连接所用的一个对象,可以用来发送和接收数据。
  • TCP/IP协议:TCP/IP协议是Internet网络协议的基础,它定义了数据如何从一个计算机传输到另一个计算机,并规定了各种服务的标准规范。

Python中Socket模块的使用

Python提供了支持网络编程的socket模块,通过这个模块我们可以实现客户端和服务端之间的数据交互。下面,我们来简要了解一下:

  • 服务器端执行流程:

    • 创建一个socket对象;
    • 绑定到一个IP地址和端口号;
    • 监听连接请求;
    • 接受客户端的连接请求;
    • 接收客户端发送的数据,并发送响应数据;
    • 关闭连接。
  • 客户端执行流程:

    • 创建一个socket对象;
    • 连接到服务器;
    • 发送请求数据;
    • 接收服务器返回的响应数据;
    • 关闭连接。

示例1:基于Socket实现简单的TCP客户端和服务端

服务器端代码实现:

import socket

# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名称
host = socket.gethostname()

# 设置一个端口号
port = 9999

# 绑定端口号和主机
server_socket.bind((host, port))

# 设置监听数量
server_socket.listen(5)

# 等待客户端连接请求
while True:
    # 建立客户端连接
    client_socket, addr = server_socket.accept()

    print("Got a connection from %s" % str(addr))

    msg = 'Welcome to the server!'

    # 向客户端发送消息
    client_socket.send(msg.encode('utf-8'))

    # 关闭连接
    client_socket.close()

客户端代码实现:

import socket

# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名称
host = socket.gethostname()

# 设置一个端口号
port = 9999

# 连接服务,指定主机和端口
client_socket.connect((host, port))

# 接收小于 1024 字节的数据
msg = client_socket.recv(1024)

client_socket.close()

print(msg.decode('utf-8'))

在这里,我们开启了一个服务器程序,并且在客户端向服务器发送一个连接请求后,服务器向客户端发送一条欢迎消息。

示例2:基于Socket实现在线聊天室服务端

服务器端代码实现:

import socket
import threading

class Server:
    def __init__(self, host, port):
        # 创建 socket 对象
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 绑定端口号和主机
        self.server_socket.bind((host, port))

        # 设置监听数量
        self.server_socket.listen(10)

        print("Server started on port %s" % str(port))

        self.clients = []

    def start(self):
        while True:
            client, address = self.server_socket.accept()

            client.send("Welcome to the chat room!".encode())

            self.clients.append(client)

            threading.Thread(target=self.client_thread, args=(client, address)).start()

    def client_thread(self, client, address):
        while True:
            try:
                msg = client.recv(1024).decode()

                self.broadcast(msg, client)
            except:
                print("Disconnected: %s:%s" % address)
                client.close()
                break

    def broadcast(self, msg, sender):
        for client in self.clients:
            if client != sender:
                try:
                    client.send(msg.encode())
                except:
                    client.close()
                    self.clients.remove(client)

host = socket.gethostname()
port = 9000

s = Server(host, port)
s.start()

客户端代码实现:

import socket
import threading

class Client:
    def __init__(self, host, port):
        # 创建 socket 对象
        self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        # 连接服务,指定主机和端口
        self.client_socket.connect((host, port))

        # 接收小于 1024 字节的数据
        print(self.client_socket.recv(1024).decode())

        threading.Thread(target=self.receive).start()

    def receive(self):
        while True:
            try:
                msg = self.client_socket.recv(1024).decode()

                if msg:
                    print(msg)

            except:
                print("Error receiving message")
                self.client_socket.close()
                break

    def send(self):
        while True:
            message = input()

            self.client_socket.send(message.encode())

host = socket.gethostname()
port = 9000

c = Client(host, port)
c.send()

在这个聊天室示例中,我们开启了一个服务器进程,当客户端连接到服务器时,服务器会向客户端发送一条欢迎消息,并将该用户加入客户端列表。当任意一个客户端发送消息时,该消息就会被广播到该聊天室中所有在线的客户端。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python基于socket实现TCP客户端和服务端 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • PythonCrashCourse 第三章习题

    PythonCrashCourse 第三章习题 简介 PythonCrashCourse 是一本适合初学者的 Python 教程。第三章主要讲解列表 (list) 的相关知识。 在这个章节中,本书提供了一些练习题,我们一起来看一看吧。 习题 3-1:创建列表并输出 题目描述 创建一个列表,其中包含至少 3 个人的名字,然后使用这个列表打印一条消息,对这些人说…

    其他 2023年3月28日
    00
  • qq聊天记录文件在哪里

    下面是针对 “qq聊天记录文件在哪里”的攻略: 查找QQ聊天记录文件 QQ聊天记录文件的默认保存位置是在用户目录下的“我的文档”文件夹中的“Tencent Files”文件夹,具体路径为: C:\Users\你的用户名\Documents\Tencent Files 在 Tencent Files 文件夹中,可以找到和 QQ 号码相关的文件夹,每个文件夹中都…

    其他 2023年4月16日
    00
  • 如何修复快捷方式lnk文件的打开方式

    如何修复快捷方式(.lnk)文件的打开方式 快捷方式(.lnk)文件是指向其他文件或文件夹的快速访问链接。如果你的快捷方式文件的打开方式出现问题,可能会导致无法正常打开目标文件或文件夹。下面是修复快捷方式文件打开方式的完整攻略: 步骤一:重置文件关联 打开“控制面板”。 在控制面板中,选择“默认程序”。 点击“关联一个文件类型或协议与特定的程序”。 在文件类…

    other 2023年8月6日
    00
  • javascript基础进阶_深入剖析执行环境及作用域链

    JavaScript基础进阶: 深入剖析执行环境及作用域链攻略 1. 执行环境(Execution Context) 执行环境是JavaScript中代码执行的环境,它包含了变量、函数和对象等。在执行JavaScript代码时,会创建一个全局执行环境,并且每当函数被调用时,都会创建一个新的执行环境。 执行环境的创建过程包括以下几个步骤:- 创建变量对象(Va…

    other 2023年8月19日
    00
  • 图文详解java反射机制及常用应用场景

    图文详解java反射机制及常用应用场景 Java反射机制是指在运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法。Java的反射机制提供了一种类的解析和操作方式,使得在编码时不必知道类的内部结构,也可以操作类的内部属性和方法。下面将从以下方面详细讲解Java反射机制及常用应用场景: 反射的定义和作用 反…

    other 2023年6月27日
    00
  • docker容器中切换用户,提示权限不足的解决

    当我们需要在Docker容器中切换用户时,有时候会遇到“权限不足”的错误提示。这主要是由于容器内部的用户与宿主机用户不一致所致。为了解决这个问题,我们需要通过以下几个步骤来实现: 查看当前容器内部的用户信息 运行以下命令: $ id 此命令会返回当前容器内的用户信息,例如: uid=0(root) gid=0(root) groups=0(root) 添加一…

    other 2023年6月27日
    00
  • Java 反射机制原理与用法详解

    Java 反射机制原理与用法详解 什么是 Java 反射机制 Java 反射是指程序可以自己获取自身的信息,如类名、属性、方法、注解等。通过反射,可以在运行时动态地获取类的信息、动态创建类对象、动态调用类的方法。 Java 反射的主要应用 动态生成Java类对象 动态获取类的属性、方法和注解等信息 动态调用类的方法 反射原理 Java反射机制是基于JVM来实…

    other 2023年6月27日
    00
  • Win10系统下去掉右键新建菜单中bmp图像选项的操作步骤

    以下是Win10系统下去掉右键新建菜单中bmp图像选项的操作步骤: 步骤一:打开注册表编辑器 为了能够操作注册表,我们需要打开注册表编辑器。具体操作步骤如下:1.按下“Win+R”组合键,打开运行窗口;2.在运行窗口中输入“regedit”,然后点击“确定”按钮。 步骤二:定位菜单项 接下来,我们需要找到“bmp”菜单项的命令位置,具体操作步骤如下:1.在注…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部