python之实现TCP、UDP通信

本文深入探讨了线程与进程的概念,解释了它们在程序执行中的作用,包括线程的轻量化特性、进程的独立性,以及它们如何共享资源。同时,文章提供了Python中创建线程和进程的代码示例,并讨论了多线程和多进程的应用场景。

线程
进程
通信

线程

什么是线程?

线程是轻量的进程,是程序执行流最小的单元,一个标准的线程由线程ID、当前计算机的指令指针、寄存器集合和堆栈组成。线程是进程的实体,是被系统独立调度和分派的基本单元。线程不拥有私有的系统资源,但可以与同属一个进程中的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。
几核处理器只能同时处理几个线程。多线程执行顺序看起来是同时进行的,实际上是cpu在多个线程之间快速切换执行,也就是说一个线程被分配的时间片完成后,线程执行的信息被保存下来了,cpu执行下一个线程,再到cpu读取该线程信息时并执行该线程。

可以参考如下网址:
https://blog.csdn.net/u014421556/article/details/79666409
了解实际程序运行中线程状态。

创建线程
import threading
  1. 函数式创建
    threading.Thread(target=None, name=None, args=())

  2. 创建线程类
    继承threading.Thread
    重写run方法
    start启动

进程

什么是进程?

进程是指正在执行的程序,是程序正在运行的一个实例。它是由程序指令、从文件、其他程序读取的数据或系统用户的输入组成。每次执行程序时,操作系统会创建一个新的进程去运行程序指令,每个进程由唯一的pid表示。
单个程序中需要多个进程完成不同的工作,就叫多进程,多进程主要用来cpu密集型任务,如大量的数学计算,每个进程是独立的,不会共享数据。

创建进程
from mutilprocessing import Process
  1. 函数式创建
    Porcess(group=None, target=none,name= none,arg=(), kwargs={},*,daemon=none)
  2. 创建进程类
    继承multiprocessing.Process
    重写run方法
    start启动

通信

了解OSI七层网络模型,数据在网络传输过程,是封装与解封装的过程,发送方通过各种封装处理,把数据转换成比特流形式,比特流在信号传传输的硬件媒介中传输,接收方再把比特流进行解封装处理。
在这里插入图片描述
参考网址: https://www.cnblogs.com/qishui/p/5428938.html
https://blog.csdn.net/andrewgithub/article/details/81603205
https://baike.baidu.com/item/七层模型/1441391?fr=aladdin
TCP/IP 四层网络结构图
在这里插入图片描述
TCP/IP协议 在网络层有两个重要的协议:TCP(传输控制协议) ,UDP(用户数据报协议)。两者之间区别细节方面,可以网上搜索参考。TCP主要是点对点,面向连接的,实行可靠的传输,会有三次握手。UDP则是无连接的,不可靠的传输协议,但是速度快,可能再传输过程中有丢包现象。

代码

上面讲了这些 下面开始叙述代码。

  1. 多线程与网络编程
import socket
import time
serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12345
serverSocket.bind(("192.168.1.103",port))

serverSocket.listen(10)
print("start socket server ...")

while True:
    #accept() 返回的是连接客户端连接,地址(客户端的ip,以及端口号)
    clientSocket,addr = serverSocket.accept()
    print("从{0}连接上客户端".format(addr))
    
    while True:
        clientData = clientSocket.recv(1024).decode("utf-8")
        print("服务器端接收消息:",clientData)

        if(not clientData or clientData == 'quit'):
            break
        
        msg = "服务器当前时间={0}".format(time.ctime())
        clientSocket.send(msg.encode("utf-8"))

    clientSocket.close()
serverSocket.close()
import socket

clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12345
clientSocket.connect(("192.168.1.103",port))
print("start socket client ...")

wile True:
    data = input("请在客户端输入发送的内容:")

    if not data:
        break
    clientSocket.send(data.encode("utf-8"))
    serverData = clientSocket.recv(1024)

    if not serverData:
        break
    
    print("客户端接收的信息为:",serverData.decode("utf-8"))

clientSocket.close()

服务端
在这里插入图片描述

客户端
在这里插入图片描述

  1. 传送文件
import socket
import os

serverSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12346
serverSocket.bind(("192.168.1.103",port))
serverSocket.listen(10)

fileName = 'udp20190831184608.png'
while True:
    #accept() 返回的是连接客户端连接,地址(客户端的ip,以及端口号)
    clientSocket,addr = serverSocket.accept()
    print("start file transport ...")
    with open(fileName, 'rb') as file:
        fileSize = os.stat(fileName).st_size
        clientSocket.send(str(fileSize).encode('utf-8'))
        for line in file:
            clientSocket.send(line)
import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port = 12346
clientSocket.connect(("192.168.1.103",port))

fileinfo = clientSocket.recv(1024).decode('utf-8')
fileSize = (int)(fileinfo)
print("filetotal: {0}".format(fileSize))

recvSize = 0
fileName = "test.png"

with open(fileName, 'wb') as file:
    while recvSize < fileSize:
        data = clientSocket.recv(1024 * 5)
        print("recv size ")
        recvSize += len(data)
        file.write(data)
    else:
        print("fileTotalSize= {0}".format(recvSize))
    
print("----------file recv ok!----------------")

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长,行则降至

无聊,打赏求刺激而已

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值