python中的tcp示例详解

yizhihongxing

Python中的TCP示例详解

在Python中,使用TCP/IP协议进行网络通信非常常见。本篇文章将结合两个简单的例子,详细讲解Python中如何使用TCP协议进行通信。

示例一:客户端与服务端的基本交互

首先,我们需要了解socket模块。在Python中,socket模块提供了构建网络应用程序所需的基础设施。具体可以通过以下代码引入socket模块:

import socket

接下来,我们将创建一个简单的客户端程序,连接到指定的服务器。客户端会发送一条消息给服务器,然后等待服务器的回复。以下是基本示例代码:

import socket

HOST = 'localhost'
PORT = 8888

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

在以上代码中,socket.AF_INET表示使用IPv4协议,socket.SOCK_STREAM表示使用流式TCP协议。s.connect((HOST, PORT))方法表示连接到指定的服务器,端口号为8888。s.sendall(b'Hello, world')表示向服务器发送一条消息。接着,客户端等待服务器的回复,收到消息后将其打印出来。

接下来,我们将创建一个简单的服务器程序,接收客户端的消息并给出回复。以下是基本示例代码:

import socket

HOST = 'localhost'
PORT = 8888

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

在以上代码中,s.bind((HOST, PORT))方法表示指定服务器的IP地址和端口号。s.listen(1)表示监听客户端的请求,最大允许连接数为1。conn, addr = s.accept()方法表示等待客户端的连接请求,然后建立连接。conn.recv(1024)方法表示接收客户端发送的消息,conn.sendall(data)方法表示向客户端发送回复消息。当客户端没有发送消息时,服务端程序退出循环。

以上代码可通过使用python3命令运行,模拟客户端和服务端进行简单的交互。

示例二:使用Python实现聊天室

假设你需要实现一个简单的聊天室,可以通过以下示例代码实现。

import socket
import threading

class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_socket.bind((self.host, self.port))
        self.server_socket.listen(5)
        self.clients = []

    def broadcast(self, message, sender):
        for client in self.clients:
            if client != sender:
                client.send(message)

    def handle(self, client):
        while True:
            try:
                message = client.recv(1024)
                if message:
                    message = "{}: {}".format(client.getpeername(), message.decode())
                    print(message)
                    self.broadcast(message, client)
                else:
                    self.remove(client)
            except:
                self.remove(client)
                break

    def remove(self, client):
        if client in self.clients:
            self.clients.remove(client)

    def run(self):
        print("Server started on {}:{}".format(self.host, self.port))

        while True:
            client, address = self.server_socket.accept()
            print("{} connected.".format(str(address)))
            self.clients.append(client)
            client.send("Welcome to the chatroom! Please enter your name.".encode())
            thread = threading.Thread(target=self.handle, args=(client,))
            thread.daemon = True
            thread.start()

class Client:
    def __init__(self, host, port, name):
        self.host = host
        self.port = port
        self.name = name
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def connect(self):
        self.sock.connect((self.host, self.port))

    def send_message(self, message):
        self.sock.sendall("{}: {}".format(self.name, message).encode())

    def receive_message(self):
        while True:
            try:
                message = self.sock.recv(1024)
                if message:
                    print(message.decode())
            except:
                print("Error Occured.")
                self.sock.close()
                break

if __name__ == "__main__":
    mode = input("Enter 's' for Server, 'c' for Client: ")
    if mode == "s":
        server = Server("localhost", 8888)
        server.run()
    else:
        client_name = input("Enter your name: ")
        client = Client("localhost", 8888, client_name)
        client.connect()

        receive_thread = threading.Thread(target=client.receive_message)
        receive_thread.daemon = True
        receive_thread.start()

        while True:
            message = input()
            if message.lower() == 'quit':
                break
            client.send_message(message)

以上代码可以通过以下两种方法运行:

  1. 作为服务器程序运行:在终端输入python3 chatroom.py并按回车键,然后输入s,即可将Python程序作为服务器程序运行。
  2. 作为客户端程序运行:在终端输入python3 chatroom.py并按回车键,则进入客户端模式,可以输入用户名并进行聊天。在聊天过程中,可以随时在命令行输入'quit'退出程序。

以上述代码为基础,你还可以添加更多的功能,来实现更完善的聊天室应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中的tcp示例详解 - Python技术站

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

相关文章

  • 雷电模拟器完美伪装真机

    雷电模拟器完美伪装真机攻略 雷电模拟器是一款Android模拟器,可以在PC上运行Android应用程序。但是,有些应用程序会检测模拟器环境,导致无法正常运行。本攻略将介如何使用雷电拟器完美伪装真机,以便在模拟器上运行这些应用程序。 步骤 以下是使用电模拟器完美装真机的步骤: 下载并安装雷电模拟器。 打开雷电模拟器,入“设置”->“关模拟器”页面,查看…

    other 2023年5月7日
    00
  • babel插件去除console示例详解

    Babel插件去除console示例详解攻略 在JavaScript开发中,我们经常使用console对象来进行调试和输出信息。然而,在生产环境中保留这些console语句可能会导致性能下降或者泄露敏感信息。为了解决这个问题,我们可以使用Babel插件来去除代码中的console语句。本攻略将详细介绍如何使用Babel插件去除console语句,并提供两个示…

    other 2023年8月5日
    00
  • Servlet从入门到精通(超级详细!)

    Servlet从入门到精通(超级详细!)攻略 什么是Servlet? Servlet(Server Applet)是运行在Web服务器或应用服务器上的程序,用于扩展服务器功能。Servlet的运行是由Servlet容器负责的,Servlet容器负责将请求和响应封装成ServletRequest和ServletResponse,并将它们传递给Servlet进行…

    other 2023年6月27日
    00
  • softmax可以多分类吗

    softmax可以多分类吗? 当我们进行分类问题时,通常需要使用分类模型,对于二分类问题(如判断猫和狗),我们可以使用逻辑回归模型。但是,当涉及到多分类问题时,我们需要使用其他类型的模型。其中一种流行的模型是softmax回归模型。 在softmax回归模型中,我们使用的是一个softmax函数(也称归一化指数函数),它可以将一个实向量(也称得分)转换为概率…

    其他 2023年3月28日
    00
  • mybatis主键生成器keygenerator(一)

    MyBatis主键生成器keygenerator(一) MyBatis是一种流行的Java持久化框架,它提供了许多功能来简化数据库操作。其中之一是主键生成器keygenerator,它可以自动生成主键值并将其插入到数据库中。本文将详细介绍MyBatis主键生成器keygenerator的使用方法。 1. keygenerator概述 在MyBatis中,ke…

    other 2023年5月7日
    00
  • 深度分析正则(pcre)最大回溯/递归限制

    深度分析正则(pcre)最大回溯/递归限制 正则表达式是一种描述字符模式的工具,由于其强大的表达能力和广泛的应用场景,成为了数据分析、文本挖掘等领域的重要工具。正则表达式引擎可以进行的匹配步骤是有限的,当模式中包含递归或回溯时,引擎可能会一直重复步骤,导致匹配效率降低,甚至出现崩溃等问题。 为了避免这种状况,正则表达式引擎实现了最大回溯/递归限制,即“PCR…

    other 2023年6月27日
    00
  • linux中memset的正确用法

    以下是关于Linux中memset函数的正确用法的详细攻略: memset函数简介 memset函数是C语言中的一个函数,用于将一段存空间设置为指定的值。在Linux,memset函数通常用于初始化内存间或清除内存空间。 memset函数的原型如下: void *(void *s, int c, size_t n); 其中,s 是指向要设置的内存空间的指针,…

    other 2023年5月7日
    00
  • weblogic服务器的简单使用(一)

    WebLogic服务器的简单使用(一) WebLogic是一款Java应用服务器,可以用于部署和运行Java应用程序。本文将介绍如何使用WebLogic服务器,包括安装WebLogic服务器、创建域、部署应用程序等。 安装WebLogic服务器 在使用WebLogic服务器之前,需要先安装WebLogic服务器。可以从Oracle官网(https://www…

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