Python Socket通信详解

Python是一种高级编程语言,具备力量强大的标准库,包括一组关于socket通信的类和函数。Python socket通信提供了一种简单而直接的交换数据方法,可以通过TCP或UDP创建一个连接并进行双向通信。

一、Python TCP通信

TCP(Transmission Control Protocol)是一种高可靠性的面向连接的协议,被常用于Web服务器、Email、FTP服务器等。Python socket模块提供了一组TCP通信相关的类和函数,同时也提供了一组示例代码。

import socket

#监听一个端口
def listen_port(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', port))
    s.listen(1)
    while True:
        conn, addr = s.accept()
        print('Connection address:', addr)
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
        conn.close()
listen_port(12345)

以上代码实现了一个TCP服务器示例代码,其中使用了socket.socket()创建了一个Socket对象,并调用bind()方法绑定到本地IP地址以及指定的端口号(12345)。使用listen()方法指定最大连接数,并使用accept()方法接受客户端连接请求。recv()方法用于接收客户端发送的数据,sendall()方法用于向客户端发送数据,在数据传输完毕后,使用close()方法关闭连接。

二、Python多线程通信

在实际应用中,需要同时处理多个连接,这时就需要使用多线程或多进程技术。Python提供了threading模块和socketserver模块来支持多线程通信。

import socket, threading

#监听一个端口
def listen_port(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', port))
    s.listen(5)
    while True:
        conn, addr = s.accept()
        print('Connection address:', addr)
        t = threading.Thread(target=handle_client, args=(conn,))
        t.start()
#线程处理函数
def handle_client(conn):
    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
    conn.close()
listen_port(12345)

以上代码实现了一个支持多线程的TCP服务器示例代码,其中每个客户端的连接请求被分别处理,将处理函数作为参数传递给新线程,并启动线程。

三、Python与C通信

在某些场景下,需要使用Python作为编写应用程序的用户界面,而底层的功能需要使用C语言实现。可以使用Python的ctypes模块和Socket通信来实现Python与C语言的通信。

下面是一个使用Python与C语言通信的实例。

#C语言代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080

int main(int argc, char const *argv[]) {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);

    char buffer[1024] = {0};
    char *hello = "Hello from server";

    // Creating socket file descriptor
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // Attaching socket to the port 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
                &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( PORT );

    // Forcefully attaching socket to the port 8080
    if (bind(server_fd, (struct sockaddr *)&address,
                sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
                    (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    valread = read( new_socket , buffer, 1024);
    printf("%s\n",buffer );
    send(new_socket , hello , strlen(hello) , 0 );
    printf("Hello message sent\n");
    return 0;
}
#Python代码
import ctypes

#载入C语言动态库
lib = ctypes.CDLL('./libserver.so')
lib.go.argtypes = [ctypes.c_char_p]
lib.go.restype = None

#调用C函数
lib.go(b"Hello from Python")

以上代码实现了一个从Python调用C动态库的简单示例程序,两个程序通过Socket协议进行通信,在C语言中创建了一个Socket服务器,在Python中通过ctypes模块调用C语言中的动态库。

四、Python和Netty通信

Netty是一种基于Java的高性能异步事件驱动的网络应用框架,支持多协议通信服务的开发。Python支持通过Socket协议与Netty进行通信。

#Python代码
import socket

#连接到Netty服务器
server_address = ('localhost', 9090)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_address)

#发送消息到Netty服务器
message = 'Hello from Python'
sock.sendall(message.encode())

#接收Netty服务器发送的消息
data = sock.recv(1024)
sock.close()

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

以上代码实现了一个使用Python与Netty通信的示例程序,其中Python调用socket.socket()建立连接,并使用sendall()方法将消息发送给Netty服务器,最终调用recv()方法接收Netty发送的消息。

总结

通过以上的介绍,读者可以了解到Python Socket通信的基本原理和应用场景,并掌握了基本的Socket通信技术。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 21:06
下一篇 2024-11-26 21:06

相关推荐

  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29

发表回复

登录后才能评论