python网络编程:通过socket实现TCP客户端和服务端

这篇具有很好参考价值的文章主要介绍了python网络编程:通过socket实现TCP客户端和服务端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在开头

socket服务端(基础)

socket客户端(基础)

服务端实现(可连接多个客户端) 

客户端实现

数据收发效果

写在开头

  近期可能会用python实现一些网络安全工具,涉及到许多关于网络的知识,逃不过的就是最基本的socket。本文将介绍如何通过python自带的socket库实现TCP客户端和服务端,实现多个客户端与一个服务端的消息收发,这是网络编程的基础。尽管python有许多第三方库可以创建网络客户端和服务端,但其核心都是socket模块,socket模块提供了许多有关网络连接的接口,可以干很多事情,后续我们还可能基于本文的案例慢慢继续开发,实现一些主机扫描、数据包注入等工具。

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

socket(套接字)是进程之间进行网络通信的媒介,通信时分为服务端和客户端,可见下图(图来自黑马程序员的python课件)。

socket服务端:被动等待其他进程(客户端)的连接,可以同时连接多个客户端,与之通信实现消息的收发。

socket客户端:主动连接服务端,与服务端通信。

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

下面我们先实现一个基础的服务端和客户端,实现一个客户端与一个服务端之间的通信。

socket服务端(基础)

 首先引入socket模块,并创建socket服务端对象socket_server,此时该对象还无法确定是客户端/服务端,作为服务端,应当绑定一个服务端的主机和端口,这里就以本地"localhost",端口8888为例,通过.bind方法传入元组。

import socket
# 创建socket对象
socket_server = socket.socket()
# 绑定ip和端口,表明是服务端
socket_server.bind(("localhost", 8888))

 接下来通过listen方法让服务器开始监听,传入一个int整数,表示最大连接数。此处我们实现最基础的情况传入1,仅允许一个客户端连接该服务端。接下来通过accept方法等待客户端的连接,在此之前我们可以通过print打印提示“正在等待客户端连接”。accept方法是一个阻塞是的方法,如果没有客户端连接,程序将一直在这里等待连接。.accept()方法返回一个二元元组(conn, client_addr),conn表示客户端和服务端的连接对象,client_addr = (client_host, client_port),我们用两个变量conn和address分别接收:

# listen方法内接受一个整数传参数,表示接受的连接数量,可不填
socket_server.listen(1)
# 等待客户端连接,accept方法返回二元元组(连接对象, 客户端地址信息)
# accept()方法是阻塞式的方法,如果没有客户端连接,会一直等待,不往下执行
print(f"服务端已开始监听,正在等待客户端连接...")
conn, address = socket_server.accept()
print(f"接收到了客户端的连接,客户端的信息:{address}}")

   下面就可以实现数据的收发了,数据的收发基于本次服务端与客户端的连接对象conn,而非socket对象socket_server。这里假设客户端先发来消息,服务端先接收客户端发来的消息,再给客户端发送消息。接收消息使用recv方法,该方法也是阻塞式,只要没有接收到数据就会一直等待。其中的参数是缓冲区大小,通常填1024即可,recv接收到的消息(返回值)是字节流bytes对象,因此还需要通过decode方法解码为字符串:

data: str = conn.recv(1024).decode("UTF-8")

     接收完成后,服务端通过send方法发送消息到客户端,同样,也需要将字符串编码为字节流的形式:

 msg = input("请输入你要回复客户端的消息:")
 conn.send(msg.encode("UTF-8"))  # encode将字符串编码为字节数组对象

    完善一下代码,服务端实现持续的消息接收和发送,直到服务端输入"exit"退出,关闭服务端:

while True:
    # 接收消息
    data: str = conn.recv(1024).decode("UTF-8")
    print(f"客户端发来的消息是:{data}")
    # 回复消息
    msg = input("请输入你要回复客户端的消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))  # encode将字符串编码为字节数组对象

最后关闭此次连接即可,并关闭服务端。

conn.close()
socket_server.close()

完整的服务端socket_server.py代码如下:

import socket

socket_server = socket.socket()
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
# 等待客户端连接,accept方法返回二元元组(连接对象, 客户端地址信息)
print(f"服务端已开始监听,正在等待客户端连接...")
conn, address = socket_server.accept()
print(f"接收到了客户端的连接,客户端的信息:{address}}")

# 接受客户端信息,使用客户端和服务端的本次连接对象,而非socket_server
while True:
    # 接收消息
    data: str = conn.recv(1024).decode("UTF-8")
    print(f"客户端发来的消息是:{data}")
    # 回复消息
    msg = input("请输入你要回复客户端的消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))  # encode将字符串编码为字节数组对象

# 关闭连接
conn.close()
socket_server.close()

 写完了不要着急运行,我们搞定客户端再一起试试。

socket客户端(基础)

   客户端的代码和服务端差不多,只不过客户端是主动连接服务器,因此需要.connect方法连接服务器的host和端口,传入元组(服务端主机, 服务端端口号)即可,此处我们传入("localhost", 8888):

import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务器
socket_client.connect(("localhost", 8888))

  接下来实现数据的发送和接收,此处客户端先发送消息给服务端,再接收服务端回复的消息。同样的方法,send方法发送,recv方法接收,注意Bytes字节流和字符串的转换即可:

while True:
    send_msg = input("请输入要发送给服务端的消息:")
    if send_msg == "exit":
        break
    # 发送消息到服务端
    socket_client.send(send_msg.encode("UTF-8"))
    # 接收服务端的消息
    recv_data = socket_client.recv(1024).decode("UTF-8")    # 1024是缓冲区大小,一般就填1024, recv是阻塞式
    print(f"服务端回复的消息是:{recv_data}")

   类似,最后关闭连接:

# 关闭连接
socket_client.close()

   完整的客户端代码socket_client.py如下:

import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务器
socket_client.connect(("localhost", 8888))

while True:
    send_msg = input("请输入要发送给服务端的消息:")
    if send_msg == "exit":
        break
    # 发送消息
    socket_client.send(send_msg.encode("UTF-8"))
    # 接受消息
    recv_data = socket_client.recv(1024).decode("UTF-8")    # 1024是缓冲区大小,一般就填1024, recv是阻塞式
    print(f"服务端回复的消息是:{recv_data}")

# 关闭连接
socket_client.close()

   代码完成之后,我们先运行服务端代码socket_server.py,即可实现绑定服务器端口并等待客户端连接:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

     然后开启客户端,运行socket_client.py即可建立连接 :

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

   此时回到刚才的服务端界面,可以发现出现了提示:建立了连接,此次连接的客户端主机是本机127.0.0.1,端口是2133:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全  在客户端输入消息,即可实现客户端到服务端的消息传送,同理服务端也可以发送数据到客户端:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

 任意一方输入exit即退出,另一方再发消息,由于连接已经关闭,会出现异常:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

   这样我们就实现了客户端与服务端的通信,但此时只能有一个客户端连接到服务端,如果想实现多个客户端,就需要修改服务端listen()的参数,允许更多的客户端连接,下面进行讲解。

服务端实现(可连接多个客户端) 

   这里先直接给出完整的代码server.py:

import socket
import threading


def create_server_socket(host, port):
    socket_server = socket.socket()
    socket_server.bind((host, port))
    socket_server.listen(5)
    print(f"服务端已启动,地址{host},端口{port}")
    print(f"正在等待客户端连接...")
    # 开启多线程,收发来自多个客户端的数据
    num = 0     # 标记客户端的编号
    while True:
        num += 1
        conn, address = socket_server.accept()
        print(f"服务端已接受到客户端 {num}号 的连接请求,客户端信息:{address}")
        client_handler = threading.Thread(target=handle_client, args=(conn, address, num))
        client_handler.start()


# 处理收发数据
def handle_client(conn, address, num):
    while True:
        # 接收客户端发来的数据
        data_from_client: str = conn.recv(1024).decode("UTF-8")
        print(f"客户端 {num}号:{address}发来的消息是:{data_from_client}")
        # 发送消息到客户端
        msg = input(f"请输入你要回复客户端 {num}号:{address}的消息:")
        if msg == 'exit':
            break
        conn.send(msg.encode("UTF-8"))  # encode将字符串编码为字节数组对象
    conn.close()


if __name__ == '__main__':
    server_host = input("请输入服务端Host:")
    server_port = int(input("请输入服务端port:"))
    create_server_socket(server_host, server_port)

   其实也没有特别多的变化,通过函数进行了封装,然后修改listen方法,传一个大于1的整数,表示允许更多的客户端连接,此处设置的最大连接数为5。将数据收发的过程封装在函数handle_client中,额外设置了参数num表示这是第几个连接到该服务端的客户端。

    当一个客户端成功建立连接的时候(即运行完成conn, address = socket_server.accept()之时),将接收到的客户端socket对象保存在conn变量,远程连接信息(客户端host, 客户端port)保存在address变量,并启动线程指向handle_client函数,传入连接对象conn,连接信息address和客户端号num。创建好之后,启动该线程。于此同时,服务端create_server_socket中的while True循环也已经准备好处理下一个潜在的客户端连接

客户端实现

      客户端和刚才的其实可以没啥区别,这里重新用函数封装为client1.py好了:

import socket


def create_client(host, port):
    socket_client = socket.socket()
    socket_client.connect((host, port))
    # 发送、接受数据
    while True:
        msg = input(f"请输入客户端1发送给服务端{host}:{port}的数据:")
        if msg == "exit":
            break
        # 发送数据到服务端
        socket_client.send(msg.encode("UTF-8"))
        # 接收服务端的数据
        data_from_server = socket_client.recv(1024).decode("UTF-8")
        print(f"客户端接收到服务端的消息:{data_from_server}")
    socket_client.close()


if __name__ == '__main__':
    server_host = input("请输入想要连接的服务端Host:")
    server_port = int(input("请输入想要连接的服务端port:"))
    create_client(server_host, server_port)

  由于要实现多个客户端的连接,我们可以创建另外一个文件client2.py,代码和client1一样。这里我就用刚才的socket_client.py做示范好了。

数据收发效果

   首先运行服务端代码server.py。输入服务端的host(本地localhost)和port(8888),此时服务端就进入了等待客户端连接的状态:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

 再运行客户端代码client1.py和socket_client.py 输入服务端的host和端口,即可建立连接:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

服务端显示连接建立成功,两个连接均已建立:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

 然后两个连接即可各自实现服务端与客户端的数据收发,注意都是客户端先发送消息,服务端先接收消息。客户端1号client.py如下:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

   客户端2号socket_server.py运行交互过程如下:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

  服务端server.py的运行交互过程如下:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全   任何一端输入exit即可退出,对应的客户端和服务端建立的连接会断开(其他的连接依旧正常通信),比如这里服务端断开与client1的连接,与客户端2 socket_client的通信不受影响:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

    client1客户端1由于服务端已经端口,异常退出了:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全   客户端2不受影响:

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全

   到这里就实现了多个客户端与服务端的消息传送。当然本文没有考虑如何处理阻塞、如何进行异常处理等细枝末节。后续可能会继续改进,并基于socket基本的通信不断扩展其功能,实现一些简易的网络工具。近期感觉网安就业困难,以后可能还会更新一些大数据相关的内容,敬请期待。如果读者有什么问题也欢迎评论区指出,知无不言。总结不易,还请读者多多点赞关注支持。

python网络编程:通过socket实现TCP客户端和服务端,网络安全,计算机基础,网络,tcp/ip,python,socket,网络安全文章来源地址https://www.toymoban.com/news/detail-842192.html

到了这里,关于python网络编程:通过socket实现TCP客户端和服务端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(38)
  • 网络编程——socket服务端和客户端(TCP)

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通

    2024年02月07日
    浏览(28)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(35)
  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(33)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(44)
  • 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

    Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ; 在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ; 套接字有两种类型 : 流套接字 : 提供了一个可

    2024年02月15日
    浏览(33)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(25)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(37)
  • Socket编程接口API并实现简单的TCP网络编程

    #include sys/types.h #include sys/socket.h socket()创建套接字,成功返回套接字的文件描述符,失败返回-1 domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6 type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM protocol: 一般设置为 0,表示使用默认协议 int socket(int domain, int type, int protocol); bind()将

    2024年02月13日
    浏览(22)
  • Python网络编程实战:构建TCP服务器与客户端

    Python网络编程实战:构建TCP服务器与客户端 在信息化时代,网络编程是软件开发中不可或缺的一部分。Python作为一种功能强大的编程语言,提供了丰富的网络编程库和工具,使得开发者能够轻松构建各种网络应用。本文将详细介绍如何在Python中进行网络编程,特别是如何使用

    2024年04月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包