欢迎来到沃文网! | 帮助中心 分享知识,传播智慧!
沃文网
全部分类
  • 教学课件>
  • 医学资料>
  • 技术资料>
  • 学术论文>
  • 资格考试>
  • 建筑施工>
  • 实用文档>
  • 其他资料>
  • ImageVerifierCode 换一换
    首页 沃文网 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    多线程管理与线程通信 操作系统课程设计.doc

    • 资源ID:852331       资源大小:632.53KB        全文页数:28页
    • 资源格式: DOC        下载积分:20积分
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: QQ登录 微博登录
    二维码
    微信扫一扫登录
    下载资源需要20积分
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,下载更划算!
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    多线程管理与线程通信 操作系统课程设计.doc

    1、内容摘要随着科学技术的发展,通信变得越来越重要,如何实现不同主机之间的通信,成为越来越多人关心的问题。本次课程通过实现两个端口,一个服务端口,通过多线程为客户端提供了一个交流的平台。客户通过客户端建立用户,进行信息交流。1、理解线程要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应于Visual C+中的CwinThread类对象。单独一个执行程序运行时,缺省地包含的一个主线程,主线程

    2、以函数地址的形式出现,提供程序的启动点,如main()或WinMain()函数等。当主线程终止时,进程也随之终止。根据实际需要,应用程序可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。线程被分为两种:用户

    3、界面线程和工作线程(又称为后台线程)。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进程终止。工作线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从CWinThread类派生来创建,对它来说最重要的是如何实现工作线程任务的运行控制函数。工作线程和用户界面线程启动时要调用同一个函数的不同版本;最后需要读者明白的是,一个进程中的所有线程共享它们父进程的变量,但同时每个线程可以拥有自己的变量。 2、线程的管理和

    4、操作(一)线程的启动创建一个用户界面线程,首先要从类CwinThread产生一个派生类,同时必须使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE来声明和实现这个CwinThread派生类。第二步是根据需要重载该派生类的一些成员函数如:ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等函数。最后调用AfxBeginThread()函数的一个版本:CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THR

    5、EAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ) 启动该用户界面线程,其中第一个参数为指向定义的用户界面线程类指针变量,第二个参数为线程的优先级,第三个参数为线程所对应的堆栈大小,第四个参数为线程创建时的附加标志,缺省为正常状态,如为CREATE_SUSPENDED则线程启动后为挂起状态。对于工作线程来说,启动一个线程,首先需要编写一个希望与应用程序的其余部分并行运行的函数如Fun1(),接着定义一个指向CwinThr

    6、ead对象的指针变量*pThread,调用AfxBeginThread(Fun1,param,priority)函数,返回值赋给pThread变量的同时一并启动该线程来执行上面的Fun1()函数,其中Fun1是线程要运行的函数的名字,也既是上面所说的控制函数的名字,param是准备传送给线程函数Fun1的任意32位值,priority则是定义该线程的优先级别,它是预定义的常数,读者可参考MSDN。(二)线程的优先级以下的CwinThread类的成员函数用于线程优先级的操作:int GetThreadPriority();BOOL SetThradPriority()(int nPriority

    7、);上述的二个函数分别用来获取和设置线程的优先级,这里的优先级,是相对于该线程所处的优先权层次而言的,处于同一优先权层次的线程,优先级高的线程先运行;处于不同优先权层次上的线程,谁的优先权层次高,谁先运行。至于优先级设置所需的常数,自己参考MSDN就可以了,要注意的是要想设置线程的优先级,这个线程在创建时必须具有THREAD_SET_INFORMATION访问权限。对于线程的优先权层次的设置,CwinThread类没有提供相应的函数,但是可以通过Win32 SDK函数GetPriorityClass()和SetPriorityClass()来实现。(三)线程的悬挂和恢复CWinThread类中

    8、包含了应用程序悬挂和恢复它所创建的线程的函数,其中SuspendThread()用来悬挂线程,暂停线程的执行;ResumeThread()用来恢复线程的执行。如果你对一个线程连续若干次执行SuspendThread(),则需要连续执行相应次的ResumeThread()来恢复线程的运行。(四)结束线程终止线程有三种途径,线程可以在自身内部调用AfxEndThread()来终止自身的运行;可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,然后调用CloseHandle()函数释放线程所占用

    9、的堆栈;第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止关键词:多线程 通信 服务端口 客户端目 录1.课程设计111功能主要设计内容112 主要设计原理12课程设计需求分析23概要设计231 整体设计框架232 各模块的基本算法23.2.1 多线程原理24系统实现341 原理34.2 运行环境Eclipse简介343 流程图描述543 代码描述10431 服务端代码10432 客户端代码145系统测试1751系统功能测试176总结22参 考 文 献241.课程设计11功能主要设计内容本设计主要采用java语言编写,设计一个模拟的多线程通信,可以实现客户端通过服务端,实现客户端与客

    10、户端之间进行通信。主要分为两部分,一部分为Seriver Socket端和Client Socket端。12 主要设计原理线程是进程中能够执行的实体,是进程的组成部分,也是处理器调度和分派的基本单位。允许进程包含多个可并发的线程,这些线程共享进程所获得的主存空间和资源,可以完成某一项任务而协同工作。在java语言中,多线程的机制是通过虚拟CPU来实现的。可以形象的理解为,在一个java程序内部虚拟了多台计算机,每台计算机对应一个线程,有自己的CPU,可以获取所需要的代码和数据,因此能独立执行任务,相互间还可以共用代码和数据。Java的线程是通过java.lang.Thread类来实现的,它内部

    11、实现了虚拟CPU的功能,能够接收和处理传递给它的代码数据,并提供了独立的运行控制功能。每个线程都是某个特定Thread对象所对应的run()方法来完成其操作的,方法run()称为线程体。在计算机网络技术中,两个进程间可以通过一个双向的网络通信连接实现数据交换,这种通信链路的端点被称为“套接字”,套接字在具体实现中又分为服务套接字和客户端套字。客户端有两种,通常用来实现“客户服务器”连接和数据传输。当进程间通过网络进行通信时,java技术仍使用它的流模型。每个Socket对象都封装了相应的一个输入流和一个输出流对象。如果一个进程要通过网络向另一个进程发送数据,只需简单地将数据写到与其Socket

    12、相关联的输出流中去,相对应的,一个进程可以从相关联的输入流来读取另一个进程所写出的数据。建立网络连接之后,使用与Socket相关联的I/O流一旦打开,其使用方式和先前其它I/O流的使用方式完全相同。两台计算机之间如果要建立网络连接,一台机器中必须运行一个进程来等待连接,而另一台机器必须试图连接到前一台机器。这和电话系统类似,必须由一方发起呼叫,而此时另一方必须处于等待呼叫状态。所不同的时,Socket通信的两端不是对等的等待连接请求的一端称为服务器,而主动发起连接的一端称为客户机。建立连接时所需的寻址信息包括:远程计算机的机器名或IP地址;试图连接的对方端口号。2课程设计需求分析随着网络的快速

    13、发展,人与人之间的交越来越多,如何让双方或者是更多人同时进行通信已经变得越来越重要。在当今信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。此次课程设计通过多线程通信,主要采用了建立客户端与用户端之间进行通信,虽然其功能简单,但基本实现了多个用户同时进行通信。3概要设计31 整体设计框架本程序主要分为两部分,一部分为TestServer端(服务端),主要用于监听通信端口,接收客户端连接请求,每当有新用户上线时会进行如下处理:1打开与该用户相关联的I/O流2接收新用户名3将新用户信息(包括用户名和对应的输出流对象)加入到在线用户列表中去4启动一个新的

    14、线程,该线程负责监听并转发此新用户的发言信息另一部分为TestClient端(客户端),主要是用于创建Socket对象,连接服务器的9999端口,建立连接后,通过创建新进程进行多个用户之间的通信。其主要是包括以下几个主要方面:1创建界面2输入用户的名字3建立连接4创建进程,实现进程之间的通信32 各模块的基本算法3.2.1 多线程原理每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多

    15、任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。更为重要

    16、的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。4系统实现41 原理通过Socket建立连接,以ChatServer作为服务器,作为一个中间平台进行进行交流,然后通过ChatClient作为客户端,建立多个用户,分别输入用户名登陆,输入交流的信息。当用户要通信时,只需在其它写入要的内容,通过DataOutputStream(s.getOutputStream()将其写进去。通过线程自动的将其写入到服务端的内容显示到各个用户去。里面主要是用到了Hashtabl

    17、e,它的作用是实现一个哈希表,该哈希表将键映射到相应的值,显示相应的信息来自哪个用户,方法put()将指定 key 映射到此哈希表中的指定 value,通过名字对应相应的消息。Remove(Object key)从哈希表中移除该键及其相应的值。如果该键不在哈希表中,则此方法不执行任何操作。4.2 运行环境Eclipse简介Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C+和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难

    18、具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开

    19、发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。 Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 CPL发布,第三方组件有各自自身的许可协议. 43 流程图描述开始建立服务服务端口号,并准备监听客户端启动线程run() 调用tran

    20、smitMessage(String msg,String name),进行交流输出用户名对应的信息Y输入的信息为”再见”,此用户退出个数大于0,继续交流交流信息调用客户端程序,建立新用户YN是否退出结束YN图1 ChatServer服务器流程图开始通过GUI创建界面创建用户建立与服务的连接启动线程调用transmitMessage()读取信息,进行交流输入的信息为”再见”,此用户退出结束是否结束交流YN图2 ChatServer服务器流程图建立Frame,Panel,ButtonTExtArea,TextField通过BorderLayout布局管理器,将它们添加到相应的位置将send按扭设

    21、置为事件源组件,添加成员方法addActionListener与监听器建立监听与被监听的关系 是否点击调用actionPerformedj(),得到输出流,进行信息交流YN开始结束图3 窗口器流程图开始重写线程run()方法调用transmitMessage()方法,进行信息交流遍历各个用户及用户的信息,进行交流用户信息=bye?Thread.sleep(1000),休眠1秒之后退出移出此用户remove(name)输出用户离开信息YN是否结束交流结束YN图4 线程运行流程表ServerClientServerSocket ss (9999);s.accept()DataInputStream

    22、(s.getInputStream();newDataOutputStream(s.getOutputStream();name = dis.readUTF();userList.put(name,dos);MyServerReader().start()Socket(127.0.0.1,9999);DataInputStream(s.getInputStream();newDataOutputStream(s.getOutputStream();name = dis.readUTF();开始开始结束图5 Socke通信模型43 代码描述431 服务端代码import java.io.*;im

    23、port .*;import java.awt.*;import java.awt.event.*;public class ChatClient private String name;private Socket s;private DataInputStream dis;private DataOutputStream dos;private Frame f;private TextArea ta;private TextField tf;private boolean runnable = true;public static void main(String args) ChatCl

    24、ient cc = new ChatClient();cc.createUI();cc.inputName();cc.connect();cc.createThread();public void createUI()f = new Frame(Client);ta = new TextArea();tf = new TextField();Button send = new Button(Send);Panel p = new Panel();p.setLayout(new BorderLayout();p.add(tf,Center);p.add(send,East);f.add(ta,C

    25、enter);f.add(p,South);MyClientListener listener = new MyClientListener(this);send.addActionListener(listener);tf.addActionListener(listener);f.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)ChatClient.this.shutDown(););f.setSize(400,400);f.setLocation(600,0);f.setVisibl

    26、e(true);public void inputName()String name = javax.swing.JOptionPane.showInputDialog(Input Your Name:);this.setName(name);f.setTitle(name);public void connect()try s = new Socket(127.0.0.1,9999);dos = new DataOutputStream(s.getOutputStream();dis = new DataInputStream(s.getInputStream();dos.writeUTF(

    27、name);catch (IOException e) e.printStackTrace();public void createThread()MyClientReader reader = new MyClientReader(this);reader.start(); public void stop()runnable = false;public void shutDown()trydos.writeUTF(再见);ta.append(Exit in 5 seconds!);this.stop();Thread.sleep(1000);dis.close();dos.close()

    28、;s.close();catch(Exception e)System.exit(0);public boolean getRunnable()return runnable;public void setName(String name)this.name = name;public DataInputStream getDataInputStream()return dis;public DataOutputStream getDataOutputStream()return dos;public TextArea getTextArea()return ta;public TextFie

    29、ld getTextField()return tf;class MyClientListener implements ActionListenerprivate ChatClient client;public MyClientListener(ChatClient client)this.client = client;public void actionPerformed(ActionEvent e)TextField tf = client.getTextField();String info = tf.getText();tryclient.getDataOutputStream(

    30、).writeUTF(info);catch (IOException e1) e1.printStackTrace();if(info.equals(bye)client.shutDown();tf.setText();class MyClientReader extends Threadprivate ChatClient client;public MyClientReader(ChatClient client)this.client = client;public void run()String info;DataInputStream dis = client.getDataIn

    31、putStream();TextArea ta = client.getTextArea();trywhile(client.getRunnable()info = dis.readUTF();ta.append(info + n);catch (IOException e) 432 客户端代码import java.io.*;import .*;import java.util.*;public class ChatServer public static void main(String args) Hashtable userList = new Hashtable(); String

    32、name;DataInputStream dis;DataOutputStream dos;tryServerSocket ss = new ServerSocket(9999);while(true)Socket s = ss.accept();dis = new DataInputStream(s.getInputStream();dos = new DataOutputStream(s.getOutputStream();name = dis.readUTF();userList.put(name,dos);new MyServerReader(name,dis,userList).st

    33、art();catch(Exception e)e.printStackTrace();class MyServerReader extends Threadprivate String name;private DataInputStream dis;private Hashtable userList;public MyServerReader(String name,DataInputStream dis,Hashtable userList )this.name = name;this.dis = dis;this.userList = userList;public void run

    34、()String info;trytransmitMessage(name + in!,-Server Info-);while(true)info = dis.readUTF();if(info.equals(bye)DataOutputStream dos = (DataOutputStream)(userList.get(name);Thread.sleep(1000);dos.close();dis.close();userList.remove(name);transmitMessage(name + out!,-Server Info-);break;else if(info.le

    35、ngth()0)transmitMessage(info,name);catch (Exception e) public void transmitMessage(String msg,String name)Collection doses = userList.values();DataOutputStream dos;for(Object o: doses)dos = (DataOutputStream)o;trydos.writeUTF(name + : + msg);catch(Exception e)5系统测试51系统功能测试图6 启动服务器ChatServer图7 启动客户服务

    36、器ChatClient图8 用户登陆界面注:服务器要始终打开,不断监听着客户端是否有用户进入或交流,一旦服务器停止,则会出现错误。图9 错误关闭服务器图10 再次启动客户服务器图11 两个用户进行信息交流图12 再次启动客户服务器图13 三个用户进行信息交流图14 启动多个用户,实现多个用户信息交流图15 关闭用户关闭用户之后,会提示,哪个用户已经退出,通过1秒的时间,它自动地退出。图16 关闭用户之后,其它用户继续信息交流6总结在课程设计的第一个星期里,我认真地复习了关于线程的内容以及java中关于Socket通信的内容,基本掌握了有关的知识。在第一天里,主要是构思一下思路,写出需求分析。在

    37、写需求分析分析时,我去网上看了相关线程通信的内容,同时也看了一些有关通信方面的程序。第二天开始写基本的框架,把程序分为两个部分,分为一个客户端和一个服务端。在接下来的日子,我一步一步地把程序完善,用的时间比较长,因为个人的知识有限,很多时候要会遇到许多问题。通过这次课程设计,使我加深了对线程以及多线程知识的掌握。如何实现多个线程之间的通信,刚开始的时候,我想用一个文件把服务器和客户端的交流的内容通过FileOutputStream流将它写进一个指定的文件里面,然后再通过FileInputStream流把它读出来。这样虽然可以实现,但却必须在电脑上另外建立一个文件。后来想到了用网络编辑,通过So

    38、cket与ServerSocket,两台计算机课建立网络连接,只需通过Socket并将其连接到指定的IP地址的指定端口号,然后就建立I/O连接进行读和写的操作。此课程设计中,我尝试用不同的方法去做。在输入多个用户时,要如何将他们输出的名字和对应的信息一起对应起来呢?很常规的方法就是在线程里面添加线程的名字和信息。后来找到了可以用Hashtable表,它的作用是实现一个哈希表,该哈希表将键映射到相应的值,显示相应的信息来自哪个用户,方法put()将指定 key 映射到此哈希表中的指定 value,通过名字对应相应的消息。Remove(Object key)从哈希表中移除该键及其相应的值。如果该键

    39、不在哈希表中,则此方法不执行任何操作。关于界面,我只是适当的学习一些比较有用的,如组件和容器,布局管理器,监听器,文本组件等。建立事件源组件,调用其成员addActionListener()与监听器对象建立了监听与被监听的关系。当用户用户点击时,对象会自动触发ActionEvent事件,并以该事件对象作为实参自动调用相应事件处理方法actionPerformed();通过此次实验,我基本了解了线程通信的原理,在里面我学到许多东西。而且学习到许多知识都是先前不知道的。通过不断地学习,不懂的在网上找资料,和同学老师一起交流,这样一步一步地寻求答案,把困难解决。最后把程序给做好。 这次实验实验还便我

    40、意识到,如果以后要做软件这一行,必须要对每个问题都要认真地弄清楚,只有真正的掌握了原理,你才能运用自如。另外,一旦你有了思路就马上把它记下来,不要再犹豫,因为有时你会突发想到一些你坐在电脑前无法想到的东西。还要有一颗坚持不懈的心,对于遇到的问题,你最好自己想,把它解决,实在想不到,去网上找一下资料,看一下别人怎么讲。再者,可以和老师,同学一起交流。最后就是平时要多在网上看一些程序或者找一些程序设计题,通过做程序设计题提高自己程序的编写能力。参 考 文 献1 严蔚敏,吴伟民等。数据结构(C语言版) 。北京:清华大学出版,2001。2谭浩强等。C程序设计(第三版)。北京:清华大学出版社,2006。3Mark Allen著冯舜玺译。数据结构与算法分析。北京:机械工业出版社,2007。4孙钟秀,费翔林,骆斌等。操作系统教程。北京:高等教育出版社,2008。5张利国,刘伟等。Java SE 应用程序设计。北京:北京理工大学出版社6於东军,杨静宇等。Java程序设计与应用开发。北京:清华大学出版社,2009。24


    注意事项

    本文(多线程管理与线程通信 操作系统课程设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(点击联系客服),我们立即给予删除!




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给沃文网发消息,QQ:2622162128 - 联系我们

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

    Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1

    陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922