版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 课程设计说明书课 程: 计算机网络课程设计 题 目: 基于tcp协议的 网上聊天程序 学 院: 计算机与控制学院 专 业: 计算机科学与技术 姓 名: 学 号: 指导教师: 2009年10月9日摘 要这是基于tcp协议网上聊天程序。主要分为两个部分,一部分是服务器,一部分是客户两者结合,实现了基本的局域网多人聊天功能。对于程序设计语言,选择了java语言。java程序语言自带了强大的网络功能设计包,而且具有跨平台性,这无疑可以简化很多工作,节省很多时间。为了聊天数据的可靠性,tcp协议无疑是一个很好的选择。为了实现即时通信,引入了多线程技术,从而实现了通信的即时性和并发性。关键词:tcp;j
2、ava;多线程;目 录引言31. 系统概述32. 需求分析32.1. 系统需求32.1.1. 功能需求32.2. 开发环境53. 详细设计53.1. 服务器设计53.1.1. 服务器界面设计53.1.2. 数据包63.1.3. 服务器线程块73.1.4. 打开服务器73.1.5. 用户服务线程类83.2. 客户端设计103.2.1. 客户端界面设计103.2.2. 数据包113.2.3. 连接服务器123.2.4. 接收线程123.2.5. 发送文字信息133.2.6. 修改昵称134. 所遇到的问题和分析解决144.1. 用户界面144.2. 关于多线程145. 系统特色及关键技术145.1
3、. 系统特色145.2. 关键技术155.2.1. serversocket类155.2.2. 多线程技术155.2.3. 链表技术156. 结论15引言这个项目主要是为了实现简单的局域网的多人在线聊天功能。在平时,要是临时讨论一些小问题,都要做一次集中。如果有了这个项目,无疑方便了局域网中的各个终端之间的群体讨论。程序迷你,对于计算机配置几乎没有要求,也没有平台限制,在同一局域网中只要操作系统安装有java虚拟机,双击即用。1. 系统概述在开发此系统之前,先要安装好eclipse 软件(本人用的是eclipse3.2)。eclipse是著名的跨平台的自由集成开发环境(ide)。最初主要用来j
4、ava语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如c+和python的开发工具。eclipse的本身只是一个框架平台,但是众多插件的支持使得eclipse拥有其他功能相对固定的ide软件很难具有的灵活性。许多软件开发商以eclipse为框架开发自己的ide因为eclipse是不自带gui 构建器的。为了方便制作图形界面,还要先安装gui 构建器插件 visual edit(本人用的是1.4的版本)。visual editor 所利用的最为明显的工具是 gef,即图形化编辑框架(graphical editing framework)。gef 建立于本地 eclipse 图形化工具
5、集 swt 之上,以使得开发一个图形化编辑器或者所见即所得文本编辑器更为容易。所以,要使visual edit可以正常工作,我们还要先安装gef插件。不过,gef作为 visual editor (以及其他生成代码的图形化工具)的一部分,它在后台使用 eclipse 建模框架(eclipse modeling framework, emf),以在模型、java 类和图形化表示之间进行映射,其中模型是使用 xml 元数据交换(xml metadata interchange, xmi)在内部存储的。所以还要先安装好emf插件。这三个插件都安装好之后,我们就可以像vc一样方便的做出想要的图形界面了
6、。在这里不得不说的是eclipse 软件的插件的安装。安装插件时,最好还是通过eclipse 的插件安装界面一步一步老老实实的安装,而不要直接把插件复制到对应的文件夹中,因为后者往往不能正常工作。这个系统实现了基本的局域网多人聊天功能。这个系统可分为两个部分:服务器、客户端。服务器负责和下面各个客户端之间通信的中转,当有客户端登录时,服务器会记下客户端和服务器之间建立的套接字信息。当客户端发来文字信息时,服务器会通过已建立的套接字向每一个客户端发送接收到的信息。2. 需求分析2.1. 系统需求2.1.1. 功能需求客户端:功 能描 述聊天用户由此登录服务器,进行聊天。输入项1. 服务器ip:字
7、符型,用于连接服务器。2. 昵 称:字符型,聊天时,显示在其它客户端上。3. 文字信息:字符型,你想要发送出去的聊天信息。处理描述1. 填写服务器ip,点击“连接服务器”按钮连接服务器。2. 单击“修改”按钮,就可以修改昵称,同时,“修改”二字变为“确定”。3. 在发送框中填入发送信息,点击“发送”按钮发送。4. 有人发送新的文字信息,在显示栏上就会显示出来。输出项和服务器建立连接。发送文字信息。界面要求输入框:服务器ip、昵称、文字信息显示框:聊天信息和连接信息按钮:连接服务器、修改、确定、发送服务器:功 能描 述负责和下面各个客户端之间通信的中转。输入项无处理描述1. 单击“打开服务器”按
8、钮就可以打开服务器。2. 单击“关闭服务器”按钮就可以关系服务器。输出项服务器状态信息。客户端登录和退了信息。界面要求输入框:无显示框:服务器状态信息、客户端登录和退出信息。按钮:“打开服务器”、“关闭服务器”2.2. 开发环境 编程语言:javajava平台由java虚拟机(java virtual machine)和java 应用编程接口(application programming interface、简称api)构成。java 应用编程接口为java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个java平台之后,java应用程序就可运
9、行。现在java平台已经嵌入了几乎所有的操作系统。这样java程序可以只编译一次,就可以在各种系统中运行。java应用编程接口已经从1.1x版发展到1.2版。目前常用的java平台基于java1.4,最近版本为java1.7。java分为三个体系javase(java2 platform standard edition,java平台标准版),javaee(java 2 platform,enterprise edition,java平台企业版),javame(java 2 platform micro edition,java平台微型版)。jdk版本:jdk 1.6开发环境:eclipse
10、3.2eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由eclipse项目、eclipse工具项目和eclipse技术项目三个项目组成,具体包括四个部分组成eclipse platform、jdt、cdt和pde.jdt支持java开发、cdt支持c开发、pde用来支持插件开发,eclipse platform则是一个开放的可扩展ide,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。eclipse platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,
11、而另一个工具功能在哪里开始。eclipse sdk(软件开发者包)是eclipse platform、jdt和pde所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到eclipse platform中的工具。eclipse sdk由eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。eclipse项目生产的软件以 cpl发布,第三方组件有各自自身的许可协议。用到的插件: visual edit3. 详细设计3.1. 服务器设计3.1.1. 服务器界面设计为了简化编程,服务器的界面使用了常用的visual ed
12、it插件提供的图形界面开发环境。主类继承于jframe 类。界面组成元件如表3.1。表3.1类型对象名上层容器备注serverframeserverframe无serverframe为主类,继承于jframejpaneljcontentpaneserverframejbuttonjbopenserverjcontentpane用于打开和关闭服务器jlabeljltip1jcontentpanetext =用户登录信息jscrollpanejsplogjcontentpane滚动条jtextareajtalogjsplog显示用户登录和退出及服务器状态信息图 3.1 服务器界面3.1.2. 数据
13、包为了便于修改和管理,我们把一些常量统一打包,放到一个数据包类中,比如服务器端口、最大套接字连接个数、用于提示的字符串等。这样一来,我们要修改这些信息只要在数据包中修改就可以而不用到源代码中一行一行的去找,简单明了。package serverdata;public class constants public final static int maxclient = 50;public final static int portnumber = 8000;public final static string stropen = 服务器已启动;public final static strin
14、g strclose = 服务器已关闭;3.1.3. 服务器线程块服务器类继承于java的serversocket类和runnable接口,这样一来,服器类对象就可以使用服务器套接字,而且还可以作为一个独立的线程而存在,以实现即时通信。线程中,对象将通过方法accept() 一直监听服务器端口,一但有新的用户接入,就通过clientlist.insertabove(socketaccept);把这个连接套接字保存在链表对象中(clientlist类),并为这个套接字新建一个专用的线程,来监听这个套接字。为了代码的紧凑,因为这个类的对象要经常调用到主类中的成员,为了方便调用,最终定把这个类作为主
15、类的一个内部类。3.1.4. 打开服务器当按下“打开服务器”按钮时,程序将建立一个服务器线程(sssocket),这个线程对象将打开服务器端口(public threadserver(int arg0, int arg1),如果成功撕开服务器端口,系统将把jbopenserver按钮的text属性改为“关闭服务器”,当再次单击这个按钮后,将关闭打开的服务器,系统也将把jbopenserver按钮的text属性改回“打开服务器”。3.1.5. 用户服务线程类为了实现即时通信,为每一个套接字都建立一个独立的线程来监控数据的接收。以方法dsin.readutf()监听来自客户端的文字信息,一但有信息
16、进入,就会对信息进行加工,然后调用方法sendtoall( client + msg );把信息发送给每一个已连接的用户。为方便管理,线程又以链表的形式保存下来。如果连接终断,线程将自己把自己从链表中踢除出来,并退出。由于用户服务线程将自己踢除出链表时,会调用到链表类(clientlist)中的方法。而这些方法是private属性的,即外部类不可见。所以把用户服务线程类(threadclient)放到了链表类(clientlist)中,作为它的一个内部类。3.1.6. 用户服务线程链表类用户服务线程链表类是用于保存用户服务线程的,之所以要自己写一个链表类,是因为,系统对链表的功能要求并不多。如
17、果用java通过的链表类也是可以的,只是这就带来了些许冗余,使用起来也不灵活,所以后来还是决定自己写一个链表类。链表类中的元素对象都是用户服务线程类对象。链表类只包含了几个方法,如:public void insertabove( socket clientsocket )在表头插入元素,因为,系统不需要元素 必需以一定的规则排列,所以在表头插入元 素就一个插入元素的方式就足够 了。private void deleteclient( threadclient threadclient )删除结点方法,这个方法专门用来 给用户服务线程类把自己删除用的。public void sendtoall
18、( string msg )这个方法可以对链表中的所有元素指向的客户端发 送信息。3.2. 客户端设计3.2.1. 客户端界面设计为了简化编程,服务器的界面也使用了常用的visual edit插件提供的图形界面开发环境。主类继承于jframe 类。界面组成元件如表3.2。表3.2类型对象名上层容器备注clientframethisclass无clientframe为主类,继承于jframejpaneljcontentpanethisclassjlabeljlabel1jcontentpanetext = 聊 天 记 录jlabeljlabel2jcontentpanetext = 服务器ipj
19、labeljlabel00jcontentpanetext = 昵称jtextfieldjtfipjcontentpane接收服务器ipjtextfieldjtfnamejcontentpane接收昵称jbuttonjbconnectjcontentpanetext = 连接服务器jbuttonjbsendjcontentpanetext = 发 送jbuttonjbchangenamejcontentpanetext = 修改jscrollpanejsplogjcontentpane聊天记录框滚动条jscrollpanejspmsgjcontentpane输入文字框滚动条jtextareaj
20、talogjsplog聊天记录框jtextareajtamsgjspmsg输入文字框图3.23.2.2. 数据包为了便于修改和管理,我们把一些常量统一打包,放到一个数据包类中,有服务器端口、最大套接字连接个数、用于提示的字符串等。一样一来,我们要修改这些信息只要在数据包中修改就可以而不用到源代码中一行一行的去找,简单明了。package clientdata;public class constants public final static int maxclient = 50;public final static int portnumber = 8000;public final st
21、atic string strsuccessed = 服务器连接成功;public final static string strfailed = 服务器连接失败;public final static string strsendfailed = 发送失败;public final static string strclosed = 与服务器的连接已断开;3.2.3. 连接服务器当用户按下“连接服务器”按钮时,程序将根据输入的服务器ip尝试连接服务器。连接成功将在聊天记录框中提示连接成功,反之就提示连接失败。如果连接成功则会建立一个专用接收线程(将在下一节中详细介绍)来监听连接端口。3.2.
22、4. 接收线程接收线程用于接收服务器信息。通过dsin.readutf();来监听来自服务器的信息。一但监听到了信息就会private void appendlog(string log)方法来把信息显示在聊天记录框中。和服务器的连接失败了,会引发ioexception异常,一但捕捉到ioexception异常也会通过private void appendlog(string log)方法把连接失败信息反映出来,并且退出异常。3.2.5. 发送文字信息当用户按下“发送”按钮时,程序将会在用户打入的文字信息之前加入自定义昵称和当时的时间,然后把加工过后的信息通过方法sout.writeutf()
23、发送出去。“发送”按钮鼠标按键消息处理方法3.2.6. 修改昵称当用户按下“修改昵称”按钮时,将调用方法jtfname.seteditable(true)把昵称栏的状态修改为可编辑,按键名称也将变为“确定”。修改昵称后,按下“确定”按钮,就可以成功修改昵称了。这时将调用方法jtfname.seteditable(false)把昵称栏的状态修改为只读。4. 所遇到的问题和分析解决4.1. 用户界面在eclipse中默认并不支持如vc一样的集成图形界面编程,如果要一点一点的编写图形界面,不但繁琐还非常不直观,光这一方面就做消耗掉很多精力。后面就想着是否存在一个如vc一样的集成图形界面编程一样的插件
24、来完成这部分的工作。后面百度了一下,果然有这样的一个插件也就是上面提到的 visual edit。有了这个插件,图形界面的编程就变得简单多了,按钮的鼠标处理函数的加入也变得非常简单,节省了很多编程代码的时间。4.2. 关于多线程以前并没有做过这一类的即时程序,也没用过多线程。开始的时候,想着,直接在按下按钮时,在对应的消息处理方法中直接监听,后来发现行不过,因为监听,程序就卡在那断代码中,不往下执行因为方法一直不退出,界面也就无法更新。于是只好引入了多线程。在线程中监听,这样一下界面更新和监听就可以并行执行了。4.3. 关于滚动条用户登录信息框和聊天记录框都用到了滚动条。如果显示框中的行数超出
25、了显示框中可以显示的行数范围,就会出现滚动条。可问题是,显示超出范围时,滚动条却不会自动滚动到最底下。后来看了好久jdk也没找到关于这方面的方法。后来百度了一下,发现当文本区中的输入焦点改变的时候滚动条总是保证输入焦点的位置在可见文本区中。于是想到了自己写一个专用的方法。这个方法把文本区的内容更新之后立刻把文本区的输入焦点移动到文本区内容的末尾,这样,每次更新显示框时,滚动条都会自己下拉到最底下。5. 系统特色及关键技术5.1. 系统特色本系统仿的是qq的界面非常友好,只要有点计算机基础的人都可以立马上手。大量运用了内部类,程序的结构也非常紧凑、非常精简,几乎没有bug。由于程序非常迷你,对计
26、算机的配置几乎没有要求。由于用的是java语言,使得本软件的使用实现了跨平台。只要在同一局域网中,只要平台安装有java虚拟机,就可以使用本软件,无需安装,无需配置。5.2. 关键技术5.2.1. serversocket类tcp协议是一种非常成熟,非常通用的协议,是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(transport layer)通信协议。再加上java标准类serversocket和socket的使用就可以很方便的实现服务器和客户端之间的连接,和断开,而不用设计专门的连接机制和退出机制。5.2.2. 多线程技术界面的更新、服务器端口的监听、已连接套接字的监听、信息的发
27、送都要求可以并行的执行。现在引入了多线程技术,就可以简单的实现这一功能。一个功能一个线程,无论哪一个功能出现了异常都不会影响到其他功能。5.2.3. 链表技术因为每一个时刻连接到服务器的客户端个数都是随机的、不可预知的。使用的链表技术,既可以随时保存下来连接的套接字,又可以灵活增减占用的内存空间。6. 结论计算机网络课程设计中,不只强化了对于计算机网络的认识,还加深了对java语言的了解,也真正的意识到了多线程技术的作用。每写一段代码都在强化着自己的专业水平。专业程序员都是一行一行的编程编出来的,一点都不假。开始的时候,本计划用vc来做的,因为对于本人来说vc才是最熟悉的。以前有学过java。
28、不过那时候都是因为是必修课,学过之后就一直不用了。开始的时候是不打算用java来做的。只是一直听说java的网络功能很强大,自己也想看看到底强大在哪里,也算想拓展一下自己的技术面吧,于是就选择了java。由于很久没有用了,开始的时候java的一些语法都要翻书看。不过用着用着,以前的感觉也就都回来了,直到把作品的做出来,发现生成的代码非常少,界面框架插件生成的代码也是几乎没有冗余。如果用vc来做,单是界面框架就会生成很多代码和冗余。不过关于界面可视化开发上,还是vc比较成熟,也相对友好一点。在用java的 gui 构建器插件visual edit时,常常会有些小的显示异常,不过还好,不影响工作。
29、 膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈
30、羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀
31、肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿蒇虿肃莂蚂肈肂蒄薅羄肁薆螀袀肀芆薃螆聿莈蝿蚂膈蒁薁羀膈膀螇袆膇芃薀螂膆蒅袅螈膅薇蚈肇膄芇蒁羃膃荿蚆衿膃蒁葿螅节膁蚅蚁芁芃蒇罿芀莆蚃羅艿薈蒆袁芈芈螁螇芇莀薄肆芇蒂螀羂芆薅薂袈莅芄螈螄羁莇薁蚀羀葿螆肈羀艿蕿羄罿莁袄袀羈蒃蚇螆羇薅蒀肅羆芅蚅羁肅莇蒈袇肄蒀蚄螃肄腿
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年南京机电职业技术学院单招综合素质考试题库带答案详解(突破训练)
- 船舶电器安装工改进评优考核试卷含答案
- 金属材酸碱洗工岗前发展趋势考核试卷含答案
- 空调器装配工冲突管理模拟考核试卷含答案
- 数码冲印师保密强化考核试卷含答案
- 数控型材专用切割机操作工岗前节能考核试卷含答案
- 水生物检疫检验员保密意识强化考核试卷含答案
- 防暴指导员常识测试考核试卷含答案
- 选煤干燥工安全实操竞赛考核试卷含答案
- 金属网制作工安全培训知识考核试卷含答案
- 2025年安全生产典型事故案例
- GB/T 46161.2-2025道路车辆气压制动系第2部分:管、锥面密封外螺纹接头和螺纹孔
- 2026届山东省菏泽市曹县中考物理最后一模试卷含解析
- 济宁殡葬管理办法
- 银行零星装饰维修 投标方案(技术标)
- 中考英语 三大从句(宾语从句、状语从句和定语从句)核心知识点与练习题
- 电力工程施工现场协调措施
- 肩袖损伤中医护理查房
- 初中退宿申请书范文
- 喉部激光手术患者围手术期气道管理
- 应急管理的未来趋势与挑战
评论
0/150
提交评论