大三下tcp ip技术第11章_第1页
大三下tcp ip技术第11章_第2页
大三下tcp ip技术第11章_第3页
大三下tcp ip技术第11章_第4页
大三下tcp ip技术第11章_第5页
已阅读5页,还剩33页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1页 第11章 网络编程综合实例第2页聊天软件编写Step 1确定程序功能好友管理:通过聊天窗口,可以添加新的好友;聊天:最基本功能。可以把消息传给好友;聊天记录:可以查看好友的聊天记录。第3页聊天软件编写首先来看一下最终软件的界面。第4页聊天软件编写上述窗口可以分为如下几个部分左上:该部分是聊天记录框。里面有你和朋友聊天的通话记录;左下:该部分是输入框。是你将要发出的通话内容;右上:该部分是好友列表。里面有你存储的好友名单;标题栏显示自己的昵称,通信的端口以及聊天的对象。第5页聊天软件编写此聊天窗口程序具有3个主要的功能模块:UDP消息收发模块:负责接收和发送UDP消息;消息处理模块:负责

2、处理UDP消息模块所接收或发生的信息;图形界面模块:负责图形用户界面,处理用户界面事件。第6页聊天软件编写两种宏观思路第一种思路把所有模块代码写在一个class里面。执行到哪一步就创建哪一步的对象;缺点程序很繁杂;大量代码会被重复使用。第7页聊天软件编写第二种思路把各个模块分开编写代码,然后通过接口把独立的模块互连起来。优点代码执行效率高;程序结构清晰;纠错针对性强。第8页聊天软件编写对于上述3个模块,我们可以使用以下两个接口来完成模块间的相互联系。MessageHandler接口import .SocketAddress;public interface MessageHandler voi

3、d handleMessage(byte data, SocketAddress addr);/处理消息的方法第9页聊天软件编写MessageHandler接口代表的是消息处理模块的接口。其中只有一个handleMessage()方法,用途是处理UDP消息收发模块接收到的消息。参数1表示收到的数据;参数2表示该消息从哪个Socket地址传过来。第10页聊天软件编写Messenger接口import .SocketAddress;public interface Messenger public void setMessageHandler(MessageHandler handler);/设置

4、消息处理器public void sendData(byte data, SocketAddress addr);/发送数据public void startMessenger();/启动消息模块第11页聊天软件编写Messenger接口代表UDP消息收发模块。其中定义了三个方法:setMessageHandler设置消息处理器方法,参数就是MessageHandler接口。其作用是为UDP消息收发模块设置一个处理消息的类UDP消息收发模块本身并不知道如何处理数据,当UDP消息收发模块收到一个消息后,就调用MessageHandler接口中的handleMessage()方法来具体处理数据。第

5、12页聊天软件编写sendData该方法用以发送数据。消息处理模块和图形界面模块均使用该方法来发送UDP消息我们把程序中所有消息都交给UDP消息发送模块统一发送。第13页聊天软件编写startMessenger该方法用于启动UDP消息处理模块。这里面有两个线程:一个负责发送消息,另一个负责接收。UDP协议在接收消息时,若消息没有发送过来,则DatagramSocket中的receive()方法会阻塞。同样,发送时也需要一定的时间。故我们必须用两个线程。否则就冲突了。第14页聊天软件编写通过MessageHandler接口和setMessageHandler()方法,我们就可以把消息处理模块和消

6、息收发模块分开让他们通过MessageHandler接口联系就可以了。图形界面模块消息处理模块UDP消息收发模块更新用户界面传递收到的消息数据发送数据第15页聊天软件编写设计程序思路要根据程序的具体功能,把程序分割成不同的模块;优先考虑使用接口这一工具来把不同模块联系起来。第16页聊天软件编写我们先来看一下最终程序运行后的结果。开始执行程序时,出现如下界面。第17页聊天软件编写对输入用户名和端口号有如下要求:要求用户名中不能包括“#”字符;要求端口号必须是数字;要求端口号的范围为065535.第18页聊天软件编写正确输入用户名和端口号后,出现主窗口。当还没有添加好友就开始发送数据时,出现如下错

7、误信息。第19页聊天软件编写我们添加好友时,需要填写好友的IP地址和端口号。具体如下图所示。第20页聊天软件编写具体通话效果如下图所示。第21页聊天软件编写第一部分UDP消息收发模块 UDP消息收发模块不仅需要处理UDP消息,还需要通过消息队列来避免不必要的线程阻塞。下面会具体介绍一下相关类和方法。第22页聊天软件编写UDP消息收发模块的实现所谓实现就是让一个类实现前面介绍的Messenger接口。我们通过类UDPMessager来实现该接口。对接口中三个抽象方法,setMessageHandler只是设置一个参数变量。我们重点介绍对sendData()方法和startMessenger()方

8、法的使用。第23页聊天软件编写UDPMessager类对于发送消息使用了一个消息列表。每次发送消息时,把消息封装成一个DatagramPacket对象,然后放入列表。public void sendData(byte data, SocketAddress addr) /实现抽象方法 synchronized (messageList) /同步,避免访问冲突 DatagramPacket msg=null; msg= new DatagramPacket (data, data.length);/封装消息 msg.setSocketAddress(addr); messageList.add(

9、msg);/将消息加入列表 messageList.notify();/唤醒发送线程 第24页聊天软件编写在sendData()方法中,把消息封装在DatagramPacket对象中,然后把这个对象放入messageList(ArrayList)中,然后唤醒等待在messageList上的线程。第25页聊天软件编写实现startMessenger()方法public void startMessenger () Thread recvThread = new Thread (new MessageReceiver();/创建消息接收线程 recvThread.start(); Thread s

10、endThread = new Thread(new MessageSender ();/创建消息发送线程 sendThread.start();第26页聊天软件编写我们通过两个实现了Runnable接口的内部类来接收/发送消息。MessageReceiver类MessageSender类第27页聊天软件编写我们需要注意在MessageSender内部类中所调用的getData()方法。该方法在messageList上同步并且在其上等待(没有消息时):messageList.wait()。唤醒该线程的地方就是在sendData()方法中的messageList.notify()每当有消息过来,

11、就会唤醒一次线程以保证消息正确发送。第28页聊天软件编写2. 消息列表的使用我们使用消息列表messageList就是为了避免阻塞现象的产生。从而保证程序正确运行。Swing线程图形用户界面模块messageList消息发送线程UDP消息收发模块添加消息取出消息第29页聊天软件编写第二部分图形用户界面模块该部分内容简单,但是代码比较多。主要就是安排界面的格式、结构和一些视觉化的要素。1. 程序中用到一些新的组件,需要做一下介绍。第30页聊天软件编写JDialog表示对话框。不能单独存在,需依赖于一个窗口。JList表示一个列表。聊天软件中那个好友列表就是用它来表示的。JList中有一个事件Li

12、stSelection,当用户选择列表中不同表项时,就会触发这个事件。JOptionPane是一个工具类。可以方便的弹出各种提示对话框。软件中的错误提示就是用它做的。第31页聊天软件编写2. 聊天窗口相关的类聊天窗口用到两个类:InputMessageDialog类就是用于多行输入的对话框,继承自JDialog类。ChatUtils类该类主要提供一些常用的静态方法。第32页聊天软件编写3. InputMessageDialog类该类在程序中会用到两次。第一次就是开始时用户名和端口号的对话框;第二此就是添加好友的对话框。该类接收一个二维String数组作为参数(构造方法里接收)。其中第二维必须有

13、两个元素,第一个是对话框上的标签文字,第二个是对应的默认值。String initValue = new String 用户名:, Alex , 端口:, 7777 ;第33页聊天软件编写4. ChatUtils类该类是一个工具类,为3个模块服务,含有如下几个主要方法:属性SEPARATOR:消息分隔符。该分隔符是把消息中的用户名和消息内容分开。值为“#”。故这也是为何用户名不能包含“#”的原因;buildMessage():该方法用以把用户名、消息内容及分隔符一起构建成一个byte数组作为发送的内容。第34页聊天软件编写5. ChatFrame类该类是最复杂的一个类。凡是设计Swing图形界

14、面的类都会有大量的代码。在ChatFrame类中包含有一个UserModel类。该类使用来描述好友的。 UserModel类的对象被使用在JList中。其包含3个属性:name:String类型,值为好友名称;addr:SocketAddress类型,值为好友的地址和端口号;messageHistory:StringBuffer类型,值为聊天记录。第35页聊天软件编写parseMessage():根据一个byte数组和相应的分隔符,解析出用户名和消息内容。该方法要和buildMessage()方法配套使用;locateFrameCenter()& locateDialogCenter():作用是把窗口或对话框的初始位置设为中央;createSocketAddrFromeStr():用以构建InetSocketAddress的实例,来发送信息。第36页聊天软件编写第三部分消息处理模块ChatFrame类实现了MessageHandler接口,扮演了程序中消息处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论