VB.net TCP服务端监听端口接收客户端RFID网络读卡器上传的读卡数据

news2024/9/21 18:37:40

本 示例使用设备介绍:WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com)

Imports System.Threading
Imports System.Net
Imports System.Net.Sockets
Public Class Form1
    Dim ListenSocket As Socket

    Dim Dict As New Dictionary(Of String, Socket) '用于保存连接的客户的套接字的键值对集合
    Dim DictThre As New Dictionary(Of String, Thread) '用于保存通信线程的键值对集合
    Dim LocalIp As String

    Dim SendBuff() As Byte

    Public Sub getIp()     '获取本机所有网卡的IP
        Dim Address() As System.Net.IPAddress
        Dim i As Integer
        Address = Dns.GetHostByName(Dns.GetHostName()).AddressList
        If UBound(Address) < 0 Then
            MsgBox("未能查找到本台电脑安装的网卡,暂不能启动本软件。", MsgBoxStyle.Critical + vbOKOnly, "注意")
            End
        Else
            For i = 0 To UBound(Address)
                comboBox4.Items.Add(Address(i).ToString())
            Next
            comboBox4.SelectedIndex = 0
            LocalIp = comboBox4.Text.Trim()
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        getIp()
        comboBox4.SelectedIndex = 0
    End Sub

    Private Sub btn_conn_Click(sender As Object, e As EventArgs) Handles btn_conn.Click
        If btn_conn.Text = "开启TCP服务,允许新客户端接入" Then
            TextBox.CheckForIllegalCrossThreadCalls = False             '取消文本框的跨线程检查
            Dim localAddress As IPAddress = IPAddress.Parse(comboBox4.Text.Trim())
            Dim EndPoint As New IPEndPoint(localAddress, txb_port.Text) '创建一个网络节点对象
            ListenSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            ListenSocket.Bind(EndPoint)                                 '给负责监听的套接字绑定一个网络节点
            ListenSocket.Listen(100)                                    '侦听,最多接受100个连接
            Dim thre = New Thread(AddressOf Connect)                    '创建一个新的线程用于处理客户端发来的连接请求
            thre.IsBackground = True                                    '设为后台线程
            thre.Start()                                                '开启线程           
            btn_conn.Text = "停止新客户端连接"
            listBox2.Items.Add("TCP端口监听服务已开启,新客户端设备可以连接并上传数据......")
            listBox2.Items.Add("")
            listBox2.SelectedIndex = listBox2.Items.Count - 1

        Else            
            ListenSocket.Close()
            ListenSocket = Nothing
            btn_conn.Text = "开启TCP服务,允许新客户端接入"
            listBox2.Items.Add("TCP服务端已禁止新客户端连接,已连接的客户端设备可继续上传数据......")
            listBox2.Items.Add("")
            listBox2.SelectedIndex = listBox2.Items.Count - 1
        End If
    End Sub

    Sub Connect() '处理客户端的连接请求的过程
        While True
            Try
                Dim SockConect As Socket = listenSocket.Accept
                Dict.Add(SockConect.RemoteEndPoint.ToString, SockConect)    '将连接成功的套接字添加到键值对集合
                listBox1.Items.Add(SockConect.RemoteEndPoint.ToString)      '添加到列表
                Dim Thre As New Thread(AddressOf RecClient)                 '创建一个新的线程用于和链接成功的套接字通信
                Thre.IsBackground = True                                    '设为后台线程
                Thre.Start(SockConect)
                DictThre.Add(SockConect.RemoteEndPoint.ToString, Thre)      '将创建的通信线程添加到键值对集合
            Catch

            End Try

        End While
    End Sub

    Sub RecClient(ByVal SockTelNet As Socket) '处理客户端发来的数据
        While True
            Try
                Dim getdata(1024) As Byte
                Dim RecLen As Int32
                Dim HexStr As String

                Try '捕获异常
                    RecLen = SockTelNet.Receive(getdata) '接受客户端发来得信息
                Catch ss As SocketException
                    listBox2.Items.Add(ss.NativeErrorCode & vbCrLf & ss.Message) '显示错误信息
                    Dict.Remove(SockTelNet.RemoteEndPoint.ToString) '移除断开连接的套接字                    
                    Return
                Catch s As Exception
                    listBox2.Items.Add(s.Message)
                    Return
                End Try

                If RecLen > 0 Then
                    Dim StrMsg As String
                    StrMsg = DateTime.Now.ToLongTimeString() + "  Get From " + SockTelNet.RemoteEndPoint.ToString + " : "
                    For i = 0 To RecLen - 1
                        StrMsg = StrMsg + getdata(i).ToString("X2") + " "
                    Next
                    If listBox2.Items.Count() > 100 Then listBox2.Items.Clear()
                    listBox2.Items.Add(StrMsg)

                    Select Case getdata(0)
                        Case &HC1, &HCF
                            If getdata(0) = &HC1 Then
                                StrMsg = "数据解析:IC读卡器上传卡号,"
                            Else
                                StrMsg = "数据解析:IC卡离开读卡器,"
                            End If
                            StrMsg = StrMsg + "IP[" + getdata(1).ToString("D") + "." + getdata(2).ToString("D") + "." + getdata(3).ToString("D") + "." + getdata(4).ToString("D") + "],"
                            StrMsg = StrMsg + "机号[" + (getdata(5) + getdata(6) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "数据包号[" + (getdata(7) + getdata(8) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "卡号长度[" + getdata(9).ToString("D") + "],"
                            HexStr = ""
                            For i = 10 To 10 + getdata(9) - 1
                                HexStr = HexStr + getdata(i).ToString("X2")
                            Next
                            StrMsg = StrMsg + "16进制卡号[" + HexStr + "],"
                            HexStr = ""
                            For i = 10 + getdata(9) To RecLen - 1
                                HexStr = HexStr + getdata(i).ToString("X2")
                            Next
                            StrMsg = StrMsg + "唯一硬件序号[" + HexStr + "]"
                            listBox2.Items.Add(StrMsg)
                            listBox2.Items.Add("")
                            listBox2.SelectedIndex = listBox2.Items.Count - 1

                            If CheckBox1.Checked Then
                                GetRespData()
                                SockTelNet.Send(SendBuff)

                                StrMsg = DateTime.Now.ToLongTimeString() + "  Send To  " + SockTelNet.RemoteEndPoint.ToString + " : "
                                For i = 0 To SendBuff.Length - 1
                                    StrMsg = StrMsg + SendBuff(i).ToString("X2") + " "
                                Next
                                listBox2.Items.Add(StrMsg)
                                listBox2.Items.Add("")
                                listBox2.SelectedIndex = listBox2.Items.Count - 1
                            End If

                        Case &HD1, &HDF
                            If getdata(0) = &HD1 Then
                                StrMsg = "数据解析:ID读卡器上传卡号,"
                            Else
                                StrMsg = "数据解析:ID卡离开读卡器,"
                            End If
                            StrMsg = StrMsg + "IP[" + getdata(1).ToString("D") + "." + getdata(2).ToString("D") + "." + getdata(3).ToString("D") + "." + getdata(4).ToString("D") + "],"
                            StrMsg = StrMsg + "机号[" + (getdata(5) + getdata(6) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "数据包号[" + (getdata(7) + getdata(8) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "16进制卡号[" + getdata(9).ToString("X2") + getdata(10).ToString("X2") + getdata(11).ToString("X2") + getdata(12).ToString("X2") + getdata(13).ToString("X2") + "],"
                            HexStr = ""
                            For i = 14 To RecLen - 1
                                HexStr = HexStr + getdata(i).ToString("X2")
                            Next
                            StrMsg = StrMsg + "唯一硬件序号[" + HexStr + "]"
                            listBox2.Items.Add(StrMsg)
                            listBox2.Items.Add("")
                            listBox2.SelectedIndex = listBox2.Items.Count - 1

                        Case &HF3
                            StrMsg = "数据解析:读卡器心跳数据包,"
                            StrMsg = StrMsg + "IP[" + getdata(1).ToString("D") + "." + getdata(2).ToString("D") + "." + getdata(3).ToString("D") + "." + getdata(4).ToString("D") + "],"
                            StrMsg = StrMsg + "机号[" + (getdata(5) + getdata(6) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "数据包号[" + (getdata(7) + getdata(8) * 256).ToString("D") + "],"
                            StrMsg = StrMsg + "心跳类型[" + getdata(9).ToString("X2") + "],"
                            StrMsg = StrMsg + "长度[" + getdata(10).ToString("D") + "],"
                            StrMsg = StrMsg + "继电器状态[" + getdata(11).ToString("X2") + "],"
                            StrMsg = StrMsg + "外部输入状态[" + getdata(12).ToString("X2") + "],"
                            StrMsg = StrMsg + "随机动态码[" + getdata(13).ToString("X2") + getdata(14).ToString("X2") + getdata(15).ToString("X2") + getdata(17).ToString("X2") + "],"
                            HexStr = ""
                            For i = 17 To RecLen - 1
                                HexStr = HexStr + getdata(i).ToString("X2")
                            Next
                            StrMsg = StrMsg + "唯一硬件序号[" + HexStr + "]"
                            listBox2.Items.Add(StrMsg)
                            listBox2.Items.Add("")
                            listBox2.SelectedIndex = listBox2.Items.Count - 1
                    End Select

                End If
            Catch
            End Try
        End While
    End Sub
    '选择在线设备向其发送指令
    Sub ButtoSend(ByVal sendcode As Integer)
        Dim seleid As String
        Dim dispstr As String
        Dim i As Integer

        If listBox1.SelectedIndex >= 0 Then
            seleid = listBox1.Text
            GetSenddata(sendcode)
            Dict.Item(seleid).Send(SendBuff)

            dispstr = DateTime.Now.ToLongTimeString() + "  Send To  " + seleid + " : "
            For i = 0 To SendBuff.Length - 1
                dispstr = dispstr + SendBuff(i).ToString("X2") + " "
            Next
            listBox2.Items.Add(dispstr)
            listBox2.Items.Add("")
            listBox2.SelectedIndex = listBox2.Items.Count - 1
        Else
            MsgBox("请先在客户端列表中选择要发送指令的在线客户端!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
        End If
    End Sub

    '按回应需要生成发送缓冲数据
    Sub GetRespData()
        If RadioButton3.Checked Then
            GetSenddata(0)
        ElseIf RadioButton4.Checked Then
            GetSenddata(1)
        ElseIf RadioButton5.Checked Then
            GetSenddata(2)
        Else
            GetSenddata(3)
        End If
    End Sub

    '按发送需要生成发送缓冲数据
    Sub GetSenddata(ByVal sendcode As Integer)
        Dim i As Long
        Dim strs As String
        Dim textbyte() As Byte

        Select Case sendcode
            Case 0
                ReDim SendBuff(38)
                SendBuff(0) = &H5A      '驱动显示文字+蜂鸣响声的功能码
                SendBuff(1) = 0         '机号低位
                SendBuff(2) = 0         '机号高位,高低位为0表示任意机号
                If checkBox2.Checked Then   '蜂鸣响声
                    SendBuff(3) = comboBox3.SelectedIndex   '蜂鸣响声代码
                    If radioButton2.Checked Then        '背光灯状态不变
                        SendBuff(3) = SendBuff(3) Or 128
                    End If
                Else
                    SendBuff(3) = &HFF              '不响蜂鸣声
                    If radioButton2.Checked Then    '背光灯状态不变
                        SendBuff(3) = SendBuff(3) And 127
                    End If
                End If
                SendBuff(4) = dispdelay.Value

                strs = textBox12.Text + "                                   "
                textbyte = System.Text.Encoding.GetEncoding(936).GetBytes(strs)
                For i = 0 To 33
                    SendBuff(5 + i) = textbyte(i)
                Next

            Case 1
                strs = "[v" + SYDX.Value.ToString() + "]"    '设置语音大小,在需要发送的语音字符串中任何位置加入[v10],表示将音量调到10级(范围0~16,0表示静音,16最大,每次重开机后,音量重置为10级)!
                strs = strs + textBox1.Text.Trim()
                textbyte = System.Text.Encoding.GetEncoding(936).GetBytes(strs)
                Dim displen As Integer
                Dim voiclen As Integer
                Dim commlen As Integer

                displen = 34
                voiclen = textbyte.Length
                commlen = 10 + displen + voiclen + 4

                ReDim SendBuff(commlen)
                SendBuff(0) = &H5C      '驱动显示文字+蜂鸣响声的功能码+开继电器+播报TTS语音
                SendBuff(1) = 0         '机号低位
                SendBuff(2) = 0         '机号高位,高低位为0表示任意机号
                If checkBox2.Checked Then   '蜂鸣响声
                    SendBuff(3) = comboBox3.SelectedIndex   '蜂鸣响声代码
                    If radioButton2.Checked Then        '背光灯状态不变
                        SendBuff(3) = SendBuff(3) Or 128
                    End If
                Else
                    SendBuff(3) = &HFF              '不响蜂鸣声
                    If radioButton2.Checked Then    '背光灯状态不变
                        SendBuff(3) = SendBuff(3) And 127
                    End If
                End If

                Select Case comboBox2.SelectedIndex '根据选择开启对应的继电器
                    Case 1
                        SendBuff(4) = &HF1
                    Case 2
                        SendBuff(4) = &HF2
                    Case 3
                        SendBuff(4) = &HF3
                    Case 4
                        SendBuff(4) = &HF4
                    Case 5
                        SendBuff(4) = &HF5
                    Case 6
                        SendBuff(4) = &HF6
                    Case 7
                        SendBuff(4) = &HF7
                    Case 8
                        SendBuff(4) = &HF8
                    Case Else
                        SendBuff(4) = &HF0
                End Select
                i = CLng(textBox11.Text)    '继电器开启时长
                SendBuff(5) = i Mod 256
                SendBuff(6) = Int(i / 256) Mod 256

                SendBuff(7) = dispdelay.Value  '显示时长
                SendBuff(8) = 0                '显示起始位
                SendBuff(9) = displen          '显示长度
                SendBuff(10) = voiclen         'TTS语音长度

                strs = textBox12.Text + "                                   "
                Dim dispbyte() As Byte
                dispbyte = System.Text.Encoding.GetEncoding(936).GetBytes(strs)
                For i = 0 To displen - 1        '显示文字
                    SendBuff(11 + i) = dispbyte(i)
                Next

                For i = 0 To voiclen - 1        'TTS语音
                    SendBuff(11 + displen + i) = textbyte(i)
                Next

                SendBuff(11 + displen + voiclen + 0) = &H55     '防干扰后缀
                SendBuff(11 + displen + voiclen + 1) = &HAA
                SendBuff(11 + displen + voiclen + 2) = &H66
                SendBuff(11 + displen + voiclen + 3) = &H99

            Case 2
                ReDim SendBuff(3)
                SendBuff(0) = &H96      '驱动蜂鸣响声的功能码
                SendBuff(1) = 0         '机号低位
                SendBuff(2) = 0         '机号高位,高低位为0表示任意机号
                SendBuff(3) = comboBox3.SelectedIndex

            Case 3
                ReDim SendBuff(5)
                SendBuff(0) = &H78      '驱动开关继电器的功能码
                SendBuff(1) = 0         '机号低位
                SendBuff(2) = 0         '机号高位,高低位为0表示任意机号
                Select Case comboBox2.SelectedIndex '根据选择开启对应的继电器
                    Case 1
                        SendBuff(3) = &HF1
                    Case 2
                        SendBuff(3) = &HF2
                    Case 3
                        SendBuff(3) = &HF3
                    Case 4
                        SendBuff(3) = &HF4
                    Case 5
                        SendBuff(3) = &HF5
                    Case 6
                        SendBuff(3) = &HF6
                    Case 7
                        SendBuff(3) = &HF7
                    Case 8
                        SendBuff(3) = &HF8
                    Case Else
                        SendBuff(3) = &HF0
                End Select
                i = CLng(textBox11.Text)    '开启时长
                SendBuff(4) = i Mod 256
                SendBuff(5) = Int(i / 256) Mod 256

            Case 4
                ReDim SendBuff(5)
                SendBuff(0) = &H78      '驱动开关继电器的功能码
                SendBuff(1) = 0         '机号低位
                SendBuff(2) = 0         '机号高位,高低位为0表示任意机号
                Select Case comboBox2.SelectedIndex '根据选择关闭对应的继电器
                    Case 1
                        SendBuff(3) = &HE1
                    Case 2
                        SendBuff(3) = &HE2
                    Case 3
                        SendBuff(3) = &HE3
                    Case 4
                        SendBuff(3) = &HE4
                    Case 5
                        SendBuff(3) = &HE5
                    Case 6
                        SendBuff(3) = &HE6
                    Case 7
                        SendBuff(3) = &HE7
                    Case 8
                        SendBuff(3) = &HE8
                    Case Else
                        SendBuff(3) = &HE0
                End Select
                i = CLng(textBox11.Text)    '开启时长
                SendBuff(4) = i Mod 256
                SendBuff(5) = Int(i / 256) Mod 256
        End Select
    End Sub
    Private Sub button6_Click(sender As Object, e As EventArgs) Handles button6.Click
        ButtoSend(2)
    End Sub

    Private Sub button7_Click(sender As Object, e As EventArgs) Handles button7.Click
        ButtoSend(3)
    End Sub

    Private Sub button8_Click(sender As Object, e As EventArgs) Handles button8.Click
        ButtoSend(4)
    End Sub

    Private Sub button10_Click(sender As Object, e As EventArgs) Handles button10.Click
        ButtoSend(0)
    End Sub

    Private Sub button9_Click(sender As Object, e As EventArgs) Handles button9.Click
        ButtoSend(1)
    End Sub

    Private Sub button3_Click(sender As Object, e As EventArgs) Handles button3.Click
        Dim copstr As String
        Dim I As Long
        Clipboard.Clear()
        copstr = ""
        For I = 0 To listBox2.Items.Count - 1
            copstr = copstr & listBox2.Items(I)
            copstr = copstr & vbCrLf
        Next
        Clipboard.SetText(copstr)
        MsgBox("TCP通讯日志报文已拷贝!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
    End Sub

    Private Sub button2_Click(sender As Object, e As EventArgs) Handles button2.Click
        listBox2.Items.Clear()
    End Sub
End Class

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1202592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode 内置扩展找不到? 设置之后不知道怎么还原?

搜索上面框起来的就是内置扩展 vscode这一招太恶心。。。

自动化测试项目:浅谈分层设计的思路

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造发起请求&a…

3种方法,教你用Pytest更改自动化测试用例执行顺序!

前言 在自动化测试中&#xff0c;自动化测试用例设计原则就是&#xff1a;执行过程时不能存在依赖顺序。那么如果测试用例需要按照指定顺序执行&#xff0c;这个时候应该怎么做呢&#xff1f; 目前单元测试框架中UnitTest没有办法改变测试用例的执行顺序&#xff0c;但是另一…

1688商品采集api接口1688代购商品采集API商品详情数据获取

做小程序商城时&#xff0c;最崩溃的瞬间是什么&#xff1f; 一定是当你有几百件商品&#xff0c;却要一件一件编辑商品名称、规格、上传图片吧…… 为了帮助商家快速上货开店&#xff0c;特意提供了1688的获取商品详情数据的接口&#xff0c;方便商家一键采集淘宝、天猫、京…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用电脑模拟产生一个三维的虚拟世界&#xff0c;提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步&#xff0c;VR已经被广泛应用到许多领域&#xff0c;包括游戏、教育、医疗、房…

Outlook如何恢复已删除邮件

Outlook如何恢复已删除邮件 操作指引&#xff1a; Outlook客户端恢复最近7天删除的邮件&#xff1a; Outlook客户端要求最新版本&#xff0c;如没有如下选项&#xff0c;建议联机更新windows update 网页邮箱恢复最近7天删除的邮件&#xff1a;

极智芯 | GPU架构与计算能力

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文分享一下 GPU架构与计算能力。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https:…

黑客技术(网络安全)—高效自学

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

subprocess 模块用法

如果你只关心命令的标准输出&#xff0c;并且希望在命令执行失败时引发异常&#xff0c;可以使用 check_output。如果你需要更多的控制&#xff0c;例如与正在运行的进程进行交互&#xff0c;可以使用 Popen。如果你希望获取标准输出和命令的状态码&#xff0c;可以使用 getsta…

数据结构-数型查找

二叉排序树&#xff08;BST&#xff09; 二叉排序树&#xff0c;又称二叉查找树&#xff08;BST&#xff0c;Binary Search Tree&#xff09; 一颗二叉树或者是空二叉树&#xff0c;或者是具有如下性质的二叉树&#xff1a; 左子树上所有结点的关键字均小于根结点的关键字&…

LeetCode(9)跳跃游戏【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 55. 跳跃游戏 1.题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回…

在Linux系统下微调Llama2(MetaAI)大模型教程—Qlora

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法

有时候因业务需要&#xff0c;paint函数在界面上绘制了成百上千个图形项Items&#xff0c;导致操作界面的时候有明显的卡顿感&#xff0c;下文会提供一种比较好的解决办法&#xff0c;先来了解下QGraphicsItem的缓存方式。 &#xff08;1&#xff09;setCacheMode(QGraphicsIt…

0基础学习PyFlink——水位线(watermark)触发计算

在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》和《0基础学习PyFlink——个数滑动窗口&#xff08;Sliding Count Windows&#xff09;》中&#xff0c;我们发现如果窗口中元素个数没有把窗口填满&#xff0c;则不会触发计算。 为了解决长期不计算的问题&a…

日志及其框架

日志技术的概述 日志 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 程序中的日志&#xff1a; 程序中的日志可以用来记录程序运行过程中的信息&#xff0c;并可以进行永久存储。 以前记录日志的方式&#xff08;输出语句&#…

设置专属链接的这些作用你知道吗?

专属链接作为一种个性化的链接&#xff0c;用于为特定的客户或群体提供定制化的体验或服务。对于企业来说&#xff0c;每个渠道或者每个客户都能拥有一个专属链接是无比便利的事情。企业可以将这个链接嵌入到各种宣传物料中&#xff0c;让客户通过输入链接即可进入与客服的交流…

thinkphp5 连接多个服务器数据库

如果你的database.php 是这样&#xff0c; 这是默认的db连接配置 如果还想连接其他服务器&#xff0c;或数据库 在config.php中追加数据库配置&#xff0c; 在使用的地方调用&#xff1a; use think\Db;public function test(){$db3Db::connect(config(db3));$result $db3…

使用Python的requests库模拟爬取地图商铺信息

目录 引言 一、了解目标网站 二、安装requests库 三、发送GET请求 四、解析响应内容 五、处理异常和数据清洗 六、数据存储和分析 七、数据分析和可视化 八、注意事项和最佳实践 总结 引言 随着互联网的快速发展&#xff0c;网络爬虫技术已经成为获取数据的重要手段…

Leetcode-104 二叉树的最大深度

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

谈谈steam游戏搬砖的收益与风险,以及注意事项

11月CSGO市场行情分析&#xff0c;是否到了该抄底的时候了&#xff1f; 今天&#xff0c;要跟大家分享的Steam平台——全球最大的游戏平台&#xff0c;现在给大家介绍下steam搬砖项目&#xff0c;这个项目既小众又稳定。 先了解一下 steam这个平台是做什么的&#xff0c;steam…