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

以下是“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日

相关文章

  • centos7.4下载与安装、使用

    CentOS 7.4 下载与安装、使用 CentOS 7.4 是使用最广泛的 Linux 发行版之一,适用于个人、企业和组织,可作为桌面操作系统或服务器操作系统。本文将介绍如何下载、安装和使用 CentOS 7.4。 下载 CentOS 7.4 可以从官方网站下载: 官方链接 国内镜像站点(推荐使用) 你可以选择下载 DVD 或 Minimal 版本。DVD…

    其他 2023年3月28日
    00
  • 在Python下进行UDP网络编程的教程

    在Python下进行UDP网络编程的教程 在Python下进行UDP网络编程,需要使用到Python内置的socket模块。socket模块提供了一种用于网络通讯的接口,能够方便地进行网络编程。 1. 创建UDP Socket 要创建一个UDP Socket,需要使用socket.socket()方法,并指定socket.SOCK_DGRAM参数。示例如下:…

    other 2023年6月25日
    00
  • 微信小程序如何设置基本的页面样式,做出用户界面UI

    当设置微信小程序的页面样式和用户界面(UI)时,可以使用WXML和WXSS来实现。下面是一个完整的攻略,包含两个示例说明: 步骤1:创建页面 首先,在微信小程序的项目中创建一个新的页面。可以通过在项目根目录下的pages文件夹中创建一个新的文件夹,并在其中添加wxml和wxss文件来创建页面。 示例说明1:创建一个名为home的页面。 步骤2:设置页面样式 …

    other 2023年9月6日
    00
  • 一起学vue:crud(增删改查)

    以下是“一起学vue:crud(增删改查)”的完整攻略,包含两个示例说明: 步骤1:创建Vue项目 首先,需要创建一个Vue项目。可以使用Vue CLI创建一个新的Vue项目。以下是创建步骤: 安装Vue CLI: bash npm install -g @vue/cli 创建一个新的Vue项目: bash vue create my-project 其中,…

    other 2023年5月9日
    00
  • Win7 EXE应用程序图标丢失(快捷方式成了一个没有图标的东西)

    Win7中,如果某个应用程序的图标出现丢失的情况,通常是因为该应用程序对应的图标文件发生了损坏或丢失,或者是应用程序的快捷方式文件被删除或移动导致的。下面是解决该问题的完整攻略: 1. 重建快捷方式 对于出现图标丢失的快捷方式,我们首先要尝试重建该快捷方式。方法如下: 打开应用程序所在的文件夹,找到应用程序的可执行文件(扩展名为.exe) 将该可执行文件拖动…

    other 2023年6月25日
    00
  • Windows Powershell属性:描述对象是什么

    Windows PowerShell属性:描述对象是什么 在Windows PowerShell中,属性是用于描述对象的特征和状态的一种方式。属性提供了关于对象的信息,可以用于查看、修改和操作对象的属性值。以下是关于Windows PowerShell属性的详细攻略。 1. 查看对象的属性 要查看对象的属性,可以使用Get-Member命令。该命令会列出对象…

    other 2023年10月15日
    00
  • xgboost、lightgbm、catboost总结

    xgboost、lightgbm、catboost总结 在机器学习和数据分析领域,各种强大的算法和工具层出不穷。在分类和回归等任务中,xgboost、lightgbm和catboost是三个备受欢迎的梯度提升决策树库,它们都是基于GBDT原理的,通过梯度提升的方法,依次训练出多个决策树,并将它们组合起来达到更准确的效果。 xgboost xgboost(eX…

    其他 2023年3月28日
    00
  • 电脑店U盘装系统 添加自定义ISO图文教程(V1.5极速版)

    电脑店U盘装系统 添加自定义ISO图文教程(V1.5极速版) 概述 此教程主要介绍如何使用电脑店U盘装系统添加自定义ISO进行系统安装,方便桌面用户无需拆机安装系统,快速自助安装操作系统。 步骤 步骤一:下载电脑店U盘装系统软件并安装 访问电脑店U盘装系统官方网站,下载电脑店U盘装系统的官方安装包。 下载完成后进入安装界面,按照提示完成电脑店U盘装系统的安装…

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