收藏 分销(赏)

用VB编写基于TCP协议聊天程序.doc

上传人:可**** 文档编号:4246644 上传时间:2024-08-30 格式:DOC 页数:34 大小:339.76KB
下载 相关 举报
用VB编写基于TCP协议聊天程序.doc_第1页
第1页 / 共34页
用VB编写基于TCP协议聊天程序.doc_第2页
第2页 / 共34页
用VB编写基于TCP协议聊天程序.doc_第3页
第3页 / 共34页
用VB编写基于TCP协议聊天程序.doc_第4页
第4页 / 共34页
用VB编写基于TCP协议聊天程序.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、基于TCP协议的点对点聊天程序计算机网络原理实验报告基于TCP协议的点对点聊天程序 作者: 班级: 学号: 导师: 目录1、 设计目标32、 Visual Basic Winsock控件简单介绍33、 Visual Basic Winsock控件的导入 34、 程序设计的主要步骤.5 4.1网络通信协议的基础和选择 54.2 客户端与服务器的实现过程.64.3 程序的编写.84.4可执行文件的生成.145、测试.156、总结.18 6.1 关键问题.18 6.2 本程序的不足.18 6.3 心得体会.181、 设计目标本实验的目标是用Visual Basic语言设计一个基于TCP/IP协议的点

2、对点的聊天程序。 利用Visual Basic Winsock控件实现。程序写完后最终生成服务器和客户端两个可执行文件,打开服务器可执行文件,即运行服务器,然后客户端可以不局域网上不同的主机上运行,输入服务器主机的IP,连接到服务器,客户端与客户端之间即可实现简易的聊天功能,在服务器可以显示在线人数以及客户端的IP地址。2、 Visual Basic Winsock控件简单介绍本实验用到Visual Basic中一个比较新的控件,就是Winsock控件。它主要用于将Winsock接口简化成易于使用的Visual Basic内部接口。在这种控件问世之前,要想通过Visual Basic 进行网络

3、程序设计,唯一的办法便是将所有Winsock函数都从DLL中导入(Import),然后重新定义必要的结构。但是这样的话,结构的数量就是很多,工作量也太大,且极易出错。Winsock控件问世之前,用Visual Basic进行网络编程就变得非常方便了。Winsock控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。3、Visual Basic Winsock控件的导入在打开Visual Bas

4、ic 软件时,在工具箱中并没有Winsock 控件,要使用它,首先要将这个控件引用进来,如下图操件:(注意可能在部件中没有该控件,解决办法请阅读“使用必读.txt”)点击“工程”部件,弹出对话框,选择Microsoft Winsock Control 6.0 。(注意可能在部件中没有该控件供选择,解决办法请阅读“使用必读.txt”)选择完成后这时在Visual Basic的编辑画面左这的工具箱中会多一个控件,这就是Winsock控件,现在就可以开始使用它进行设计编程。4、 程序设计的主要步骤4.1网络通信协议的基础和选择 a、TCP(数据传输协议)基础数据传输协议允许创建和维护与远程计算机的连

5、接。连接两台计算机就可彼此进行数据传输。如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 Dat

6、aArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。b、 UDP(用户数据文报协议)基础用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。另外 UDP 应用程序可以是客户机,也可以是服务器。为了传输数据,首先要设置客户计算机的 LocalPort 属性。然后,服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使用 Data

7、Arrival 事件内的 GetData 方法来获取已发送的信息。c、 选择通讯协议在使用 WinSock 控件时,首先需要选择使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:TCP 协议是有连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。通讯协议的选择是通过设置WinSock的Protocol属性来实现的。在这里我选择的是使用TCP通讯协议编写聊

8、天程序,通过编写程序:Winsock1(0).Protocol = sckTCPProtocol,即可以选择TCP协议。也可以通过属性窗口进行选择,如下图4.2 客户端与服务器的实现过程客户端:a、设置远程服务器主机端口Winsock1.RemotePort = 1600 b、设置远程服务器主机IP地址 Winsock1.RemoteHost = Trim(Text4.Text)在文本框Text4中输入服务器的IP地址。 c、与服务器主机连接,发生错误则关闭Winsock1.Connect d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1.S

9、endData Text1.Text 要发送的话在文本框Text1中输入 Winsock1.GetData c, vbString 接收数据,将接收到的数据存放在变量c中YesNoYesNo e、关闭连接 Winsock1.CloseSendData GetData开始 其流程图如右所示: 断开连接?远程主机IP与端口设置CloseConnect结束Error?服务器端:a、设置服务器本地端口Winsock1(0).LocalPort = 1600 b、监听客户端的连接请求Winsock1(0).Listen c、当有连接到达时,接受请求 在事件Winsock1_ConnectionReque

10、st(中编写如下代码, Winsock1(Socknumber).Accept requested d、发送与接收数据 在事件Winsock1_DataArrival中编写如下代码, Winsock1(Index).GetData c, vbString 获取数据Winsock1(i).SendData c 发送数据 e、关闭连接 Winsock1.Close其流程图如下所示:开始本地端口设置ListenError ?YesNoGetData , SendData没有断开则继续CloseClose结束4.3 程序的编写客户端的程序编写:1. 在客户端创建一个新的工程将其命名为“客户”。2. 将

11、缺省窗体命名为 “客户”。3. 将窗体的标题改为“客户端。4. 在窗体中添加一个 WinSock 控件,默认其命名为 Winsock1。5. 在窗体中添加四个TextBox 控件。默认其命名为Text1、Text2、Text3、Text4,并将其内容清空。6. 在窗体中添加四个CommandButton控件。其命名默认为 Command1、Command2、Command3、Command4,并将它们的Caption属性分别修改为“连接”、“发送”、“断开”、“清空聊天记录”。7. 在窗体上放四个Label 控件,其命名默认为Label1、Label2、Label3、Label4,并将它们的C

12、aption属性修改为“发送”、“聊天记录”、“系统消息”、“服务器IP”。8. 在窗体上放一个StatusBar控件,其命名默认为StatusBar1其属性设置如下图所示:9.打开菜单编辑器,为窗体添加菜单,设置如下图所示:10. 在窗体中添加如下的代码。 Option ExplicitPrivate Sub Command1_Click() 连接服务器程序段 Winsock1.RemoteHost = Trim(Text4.Text) Winsock1.Connect Command1.Enabled = False Do DoEvents Loop Until Winsock1.Stat

13、e = sckConnected Or Winsock1.State = sckError If Winsock1.State = sckError Then Command1.Enabled = True Winsock1.Close Text3.Text = Text3.Text + 与服务器连接失败 + Chr$(13) + Chr$(10) Else Text3.Text = Text3.Text + 与服务器连接成功 + Chr$(13) + Chr$(10) Command2.Enabled = True Command3.Enabled = True Text4.Enabled

14、= False Text1.SetFocus StatusBar1.Panels(1).Text = Connected to & Winsock1.RemoteHost & End IfEnd SubPrivate Sub Command2_Click() 发送消息程序段If Text1.Text = ThenMsgBox 不能发送空消息Else Winsock1.SendData Text1.Text Text2.Text = Text2.Text + 我说的话: + Text1.Text + Chr$(13) + Chr$(10) Text1.Text = End IfText1.Set

15、FocusEnd SubPrivate Sub Command3_Click() 断开与服务器连接程序段 Winsock1.Close Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Text3.Text = 已与服务器断开 + Chr$(13) + Chr$(10) + Text3.Text Text4.Enabled = True StatusBar1.Panels(1).Text = No connection. End SubPrivate Sub Command4_Click() 清空

16、聊天记录程序段Text2.Text = Text1.SetFocusEnd SubPrivate Sub exitbutton_Click() 点击File-exit,退出聊天EndEnd SubPrivate Sub Form_Load() 运行时最初显示的属性以及提示 Winsock1.RemoteHost = 218.192.165.192 Show MsgBox Visual Basic Winsock Chat & vbCrLf & by chendf & vbCrLf & vbCrLf & Press Button确定 , then Press Menu Help for help

17、., vbInformation Winsock1.RemotePort = 1600 Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False End SubPrivate Sub helpbutton_Click() 点击Help,弹出帮助文本ChDir App.PathShell notepad.exe 使用必读.txt, vbNormalFocus 调用外部程序notepad.exe来打开帮助文本文件End SubPrivate Sub Winsock1_Close() 关闭winsock Com

18、mand1.Enabled = True Command2.Enabled = False Command3.Enabled = False Winsock1.Close Text3.Text = 已与服务器断开 + Chr$(13) + Chr$(10) + Text3.TextEnd SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 数据到达 Dim c As String Winsock1.GetData c, vbString Text2.Text = Text2.Text + 对方说的话: + c + Chr$

19、(13) + Chr$(10)End Sub服务器端的程序编写:1. 在服务器端创建一个新的工程将其命名为“服务器”。2. 将缺省窗体命名为“服务器”。3. 在窗体中添加一个ListBox控件,将其命名为“ListBox”。4. 在窗体中添加一个WinSock控件,其名默认为Winsock1,并将其属性“Index”属性设置为0,如下图:设置完以后,Winsock1会变成Winsock1(0)。5在窗体上添加一个TextBox控件,其名默认为Text3,将其初值设置为0。6. 在窗体上添加两个Label控件,其名默认为Label1、Label2,并将它们的Caption属性改为“在线人数”、“

20、客户端IP列表”。7.打开菜单编辑器,为窗体添加菜单file。8. 在窗体中添加如下代码.。Private Gac() As BooleanDim Socknumber As Integer 定义变量Private Sub exitbutton_Click() 点击file-exit,退出系统EndEnd SubPrivate Sub Form_Load() 开始运行时显示窗口的属性以及执行的操作 Winsock1(0).LocalPort = 1600 Winsock1(0).Protocol = sckTCPProtocol Me.Caption = 服务器 & - & Winsock1(

21、0).LocalIP & : & Winsock1(0).LocalPort Winsock1(0).Listen Socknumber = 0End SubPrivate Sub Form_Unload(Cancel As Integer) unload时关闭winsock Winsock1(0).CloseEnd SubPrivate Sub Winsock1_Close(Index As Integer) 关闭winsock Winsock1(Index).Close Unload Winsock1(Index) Gac(Index) = False Text3.Text = Int(T

22、ext3.Text) - 1End SubPrivate Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) Dim ip As String Socknumber = Socknumber + 1 连接请求 Load Winsock1(Socknumber) Winsock1(Socknumber).Accept requestID ReDim Preserve Gac(Socknumber) Gac(Socknumber) = True Text3.Text = Int(Text3.Text)

23、+ 1 ip = Winsock1(Index).RemoteHostIP ListIp.AddItem ipEnd SubPrivate Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim c As String 数据到达 Winsock1(Index).GetData c, vbString Dim i As Integer For i = 1 To UBound(Gac) If Not i = Index Then If Gac(i) Then Winsock1(i).SendData c Do

24、Events End If End If Next iEnd Sub4.4可执行文件的生成点击“文件”“生成服务器.exe”即可生成服务器端的可执行文件,如下图所示:(客户.exe的生成方法相同)5、 测试双击“服务器.exe”,运行服务器双击“客户.exe”,运行客户端,在服务器IP中输入服务器IP地址218.192.165.192,连接,在系统消息文本框中会显示出是否连接成功如果连接成功,则在服务器中会显示客户端的IP地址,并且在线人数增加1成功后,可以开始聊天,在客户端发送文本框中输入需要发送的消息,并点击发送按钮,将消息发送出去经过多次测试,这个软件可以正常稳定地运行。6、总结6.1

25、关键问题本程序的关键点在于,要对整个TCP/IP通信过程有深入了解,要熟悉Microsoft Visual Basic中Winsock控件及其编程,熟悉基于消息的异步套接字,熟悉VB各个控件的操作包括相关的事件、方法以及属性等。6.2 本程序的不足在本程序中,服务端的设计得比较简单,有些功能没有加进去,例如允许/禁止某些用户、对用户发送消息等,客户端也有一些不足,在今后我会花时间好好学习一下,尽量将它们改进。6.3 心得体会Visual Basic我接触得比较早,但是利用其Winsock控件进行网络编程还是第一次。而对于TCP/IP通信协议,以前因为学校没有开设计算机网络这门课,自己也没有花时

26、间去学习它,所以说也是第一次学习。我编写的这个程序虽然比较简单,但是它包括了整个TCP/IP的通信流程,通过完成它,对我帮助很大,加深了我对TCP/IP协议的理解,而且我开始喜欢它了,受益匪浅!附录资料:不需要的可以自行删除VB HOOK(钩子)超级无敌详细用法(介绍)hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。关于HOOKS 使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完

27、成后立即移去该HOOK。HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。 WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函

28、数都会收到系统发送的消息)HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下: public function MyHook(nCode,wParam,iParam) as long 加入代码 end function 其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。 SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用Cal

29、lNextHookEx函数将系统消息传递给HOOK链中的下一个函数。 注释对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。 全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。 注释 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。HOOK类型 WH_CALLWNDPROC 和 WH_CAL

30、LWNDPROCRET HOOK WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。 WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。 WH_CBT Hook 系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点

31、前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。 WH_DEBUG HOOK 系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。 WH_FOREGROUNDIDLE Hook 系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。 WH_GETMESSAGE Hook WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GET

32、MESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。 WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键

33、盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。 WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。 WH_KEYBOARD Hook WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。 WH_MOUSE Hook WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessa

34、ge返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。 WH_MSGFILTER and WH_SYSMSGFILTER Hooks WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。 WH_SHELL Hook 一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当

35、一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。 使用HOOK 安装、销毁HOOK过程 监视系统事件安装、销毁HOOK过程 使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。Declare Function SetWindowsHookEx Lib user32 Alias SetWindowsHookExA _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod

36、 As Long, _ ByVal dwThreadId As Long) As LongidHook代表是何种Hook,有以下几种 Public Const WH_CALLWNDPROC = 4 Public Const WH_CALLWNDPROCRET = 12 Public Const WH_CBT = 5 Public Const WH_DEBUG = 9 Public Const WH_FOREGROUNDIDLE = 11 Public Const WH_GETMESSAGE = 3 Public Const WH_HARDWARE = 8 Public Const WH_JOU

37、RNALPLAYBACK = 1 Public Const WH_JOURNALRECORD = 0 Public Const WH_KEYBOARD = 2 Public Const WH_MOUSE = 7 Public Const WH_MSGFILTER = (-1) Public Const WH_SHELL = 10 Public Const WH_SYSMSGFILTER = 6lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Functi

38、on,这个Hook Function有一定的叁数格式 Private Function HookFunc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long ) As Long nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。 wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。 因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook F

39、unction的名称我们可以任意给定,不一定叫 HookFunchmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(.dll名称)来传入。dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值

40、要记录下来。因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最後的那一个所拦截,也就是说A先做keyboard Hook,而後B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。Declare

41、 Function CallNextHookEx Lib user32 Alias CallNextHookEx _ (ByVal hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ lParam As Any) As LonghHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()Declare Function UnhookWindowsHookEx Lib user32 Alias UnhookWindowsHookEx _ (ByVal hHook As Long) As LonghHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。KeyBoard Hook的范

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
百度文库年卡

猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 网络/通信

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服