java语言第二次补充3_第1页
java语言第二次补充3_第2页
java语言第二次补充3_第3页
java语言第二次补充3_第4页
java语言第二次补充3_第5页
免费预览已结束,剩余32页可下载查看

付费下载

下载本文档

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

文档简介

1、第 5 章网络与多线程技术教学提示:了解网络编程的基本概念,了解基于 TCP Socket(面向连接的)网络通信与 UDP Socket(无连接的)数据报通信的编程原理及区别;掌握 Socket 编程模式及 包中的常用类;了解多线程技术的概念及在网络编程中的应用,运用 File 类进行文件操作;理解流、标准输入/输出流的概念,运用 DataInputStream 和 DataOutputStream 类读写二进制文件;会编写简单的网络通信程序。教学要求:知 识 要 点能 力 要 求相 关 知 识Socket 类、ServerSocket 类 Datagracket 类、 DatagramSoc

2、ket 类 InetAddress 类File 类 DataInputStream 类 DataOutputStream 类 Thread 类会编写有连接的网络通信程序理解无连接的数据报通信程序会使用InetAddress 类会使用常用组件 会使用输入过滤流会使用输出过滤流会使用线程类java.lang.Thread 类 java.lang.Runnable 类 I/O 流Hashtable 类 Enumeration 类 WindowAdapter 类、 WindowEvent 类 readUTF()方法 writeUTF()方法 close()方法 Runnable 接口会使用哈希表会使用

3、枚举类会使用事件适配器类实现接口会从输入流读信息会用输出流写信息 会关闭流、关闭连接会在程序中新开线程removeAll 方法 hasMoreElements 方法 getInputStream 方法 getOutputStream 方法5.1网络聊天室5.1.1程序说明在程序中使用 包中的类可以实现网络通信。 包中定义的两个类 Socket和 ServerSocket,分别用来实现客户端和服务器端的双向连接。Java 将底层的网络通信细节予以,使得使用的编程模型是一个文件模型,即可以像操作流一样来操作网络数据传输。另外使用 Java 的多线程技术实现在网络连接中一个服务器同时为多个客户端服务

4、的功能。即使用的 TCP 协议是面向连接的,在传送数据之前必须与目标节点建立连接,数据传输结束后关闭连接。本节将要编写一个基于流式套接字的面向连接的网络聊天室程序,客户端使用 Applet浏览器与服务器端的 Java 应用程序进行通信,即客户端与服务器端建立套接字连接后,用户输入昵称就可以与其他用户聊天。聊天室界面有公聊区和私聊区,用户使用鼠标双击聊天列表中某个聊天者的昵称就可以与之进行私聊;当有新用户进入聊天室时,所有用户都能看到该用户的昵称;当某用户关闭浏览器或退出聊天室时,该昵称被删除,聊天室显示该用户离开的消息。设已有服 务器端程 序 (MyChatServer.java) ,及已经

5、编译好的 字节码文 件 (MyChatServer.class 和 Server_thread.class)放在同一文件夹中(设为:D:网络聊天室)。服务器端程序可以在 DOS 控制台使用 java 解释器运行;或者为方便使用可以制作一个双击鼠标左键打开的批处理文件(MyChatServer.bat),也放在“网络聊天室”文件夹中。设已有客户端主程序(MyC ntChat.java)和两个 Java 子程序(ChatArea.java、InputName TextField.java) 、已 经编 译好的 字 节码文 件 (MyC ntChat.class 、 ChatArea.class 及

6、 InputNameTextField.class)、网页文件(MyC ntChat.html),都放在同一文件夹(设为:D:网络聊天室)。客户端程序可以通过使用 IE 打开网页运行,也可以通过使用 AppletViewer 打开网页运行。AppletViewer 是 Java JDK 附带的工具,与使用 IE 打开网页不同的是, AppletViewer 只运行网页上的 Applet 成分,忽略网页上的其他成分。AppletViewer 需要在 DOS 控制台运行,为方便使用,创建一个调用 AppletViewer 打开网页的批处理文件 (MyC ntChat.bat),也放在“网络聊天室”

7、文件夹中。使用 DOS 控制台的客户端程序的运行结果如图 5.1 所示。图 5.1 客户端程序的运行结果131使用 DOS 控制台的服务器端程序的运行结果如图 5.2 所示。图 5.2 服务器端程序的运行结果客户端用户 1 输入昵称及进行公聊、私聊的程序运行结果如图 5.3 所示。图 5.3 客户端 1 程序运行结果客户端用户 2 输入昵称及进行公聊、私聊的程序运行结果如图 5.4 所示。图 5.4 客户端 2 程序运行结果132服务器端多客户端的程序运行结果如图 5.5 所示。图 5.5 程序运行结果5.1.2实现方案网络聊天室程序共由 4 个 Java 源文件和一个网页文件组成,即 MyC

8、hatServer.java、 MyC ntChat.java、ChatArea.java、InputNameTextField.java 和 MyC ntChat.html。服务器端程序(MyChatServer.java) 由主类(MyChatServer) 和线程类(Server_thread) 组成,程序中使用的主要方法有:main(主方法)、Server_thread(构造方法,创建客户端通信服务线程)、run(接口方法, 客户端信息)。客户端程序由主类(MyC ntChat.java)、客户端聊天界面类(ChatArea.java)和客户端输入昵称界面类(InputNameText

9、Field.java)组成,主类中使用的主要方法有:init(客户端初始化方法)、start(浏览器程序开始工作方法)和 run(接口方法);ChatArea 类中的主要方法有:ChatArea( 创建聊天界面) 、setSocketConnection( 与服务器建立套接字连接的方法) 、actionPerformed( 接口方法,实现处理事件) 和 run( 接口方法, 服务器信息) ;InputNameTextField 类中的主要方法有:InputNameTextField(构造方法,创建用户输入昵称界面)、set(设置能否聊天)、get(判断能否聊天)、setSocketConnec

10、tion(实现与服务器建立连接的方法)、actionPerformed(接口方法,实现处理事件)和 run(接口方法,来的信息)。1) 服务器端程序的整体框架服务器发133import java.io.*; import .*; import java.util.*;public class MyChatServerpublic sic void main(String args)/客户端呼叫/与客户端套接字建立起连接的服务器端套接字/存放与各聊天客户端通信的服务器线程的散列表peopleList=new Hashtable(); while(true)134try /创建一个 ServerS

11、ocket,在端口 3333客户请求catch(IOException e1)System.out.prln(正在);try /一旦有客户请求,就返回一个 Socket 对象用于同客户进行交互socket=server.accept();InetAddress address=socket.getInetAddress(); System.out.prln(用户的 IP:+address);catch (IOException e)if(socket!=null) /与客户端通信的服务器端线程/服务器端线程启动elsecontinue;class Server_thread extends T

12、hreadString nall,sex=null;/聊天者昵称、 Socket socketa=null;/文件对象/数据输入流/数据输出流Hashtable peopleList=null; /存放昵称的散列表 Server_thread(Socketshtable list)peopleList=list; socke;try /对得到的输入流进行读操作/对输出流进行写操作catch (IOException e)135public void run()while(true)String s=null; try /等待客户端发来信息if(s.startsWith(:) /如果用户提交了昵

13、称和/截取昵称/截取/检查散列表中是否已有截取到昵称的聊天者 if(boo=false)peopleList.put(name,this);/将昵称添加到散列表/通过 OUT 向线路写入信息/获取所有与客户端通信的服务器线程 while(enums.hasMoreElements()Server_thread th=(Server_thread)enums.nexement();/将当前聊天者的信息通知所有用户 th.out.writeUTF(聊天者:+name+sex);/将其他聊天者的信息通知当前用户,即本线程 if(th!=this)out.writeUTF(聊天者:++t

14、h.sex);else /如果该用户存在,提示用户重新输入 out.writeUTF(不可以聊天:);else if(s.startsWith(公共聊天内容:)String message=bstring(s.indexOf(:)+1); Enumeration enums=peopleLisements();/获取所有与客户端通信的服务器线程while(enums.hasMoreElements()(Server_thread)enums.nexement().out.writeUTF(聊天内容: +message);else if(s.startsWith(用户离开:)Enumeratio

15、n enums=peopleLisements(); while(enums.hasMoreElements() try136Server_thread th=(Server_thread)enums.nexement(); if(th!=this&th.isAlive()th.out.writeUTF(用户离线:+name);catch(IOException eee)/删除昵称/关闭当前连接System.out.prln(name+用户离开了);/结束线程else if(s.startsWith(私人聊天内容:)String 悄悄话=bstring(s.indexOf(:)+1,s.ind

16、exOf(#); String toPeople=bstring(s.indexOf(#)+1);/找到要接受悄悄话的线程Server_thread toThread=(Server_threeopleList.get(toPeople); if(toThread!=null)toThread.out.writeUTF(私人聊天内容:+悄悄话);else /通知当前用户接受私聊的用户已经离线catch(IOException ee) /当聊天者关闭浏览器时,导致发生异常/获取所有的与客户端通信的服务器线程 Enumeration enums=peopleLisements();while(en

17、ums.hasMoreElements() /判断接口中是否还有元素 tryServer_thread th=(Server_thread)enums.nexement(); if(th!=this&th.isAlive()th.out.writeUTF(用户离线:+name);catch(IOException eee)peopleList.remove(name); try服务器端程序由引入和主类、线程类。由于程序中使用了服务器套接字类ServerSocket、套接字类 Socket,因而引入了 包;使用了文件和目录路径名的抽象表示形式类 File、数据输出流类 DataOutputStr

18、eam、数据输入流类 DataInputStream,因而引入了java.io 包;使用了哈希表类Hashtable、Enumeration 接口,所以引入了java.util 包。在主类类体中有一个 main 方法,在方法体中了服务器套接字对象、套接字对象及哈希表对象; Server_thread 类继承了 Thread 类,在该类体中了 Socket、File、DataOutputStream、DataInputStream 和 Hashtable 对象;在 Server_thread 构造方法中实现与客户端通信,在 run 方法中实现启动服务器端线程,使用 break 结束线程。程序的编

19、程要点已在整体框架中标出,在 5.1.3 节中将会详细。新建“网络聊天室”文件夹,打开 JCreator(也可使用其他的 Java 代码编辑器或集成开发工具),单击上的【New】按钮,在出现的框中选择【Files】选,在该选上选择【Java File】选项,输入程序名“MyChatServer”,并选择工作位置为“网络聊天室”文件夹,单击【确定】按进入编辑器。输入前面的程序整体框架,其中注释说明部分的代码,在 5.1.3 节中可以查到,全部代上的【Save】按钮保存文件。选择【Build】|【Compile错误,可按照编译提示信息进行修改,然后保存并重新编译,码输入完成并检查无误后单击File

20、】菜单命令进行编译,直到提示“Pro程序。s completed”,编译成功。选择【Build】|【Execute File】菜单命令运行也可使用 Java JDK 提供的 Java 工具运行程序,在 DOS 控制台转入“网络聊天室”目录,输入如下命令:C:j2sdk1.4.2_14binjava MyChatServer本例采用独立的 JDK,安装 JDK 的路径为 C:j2sdk1.4.2_14,Java 工具在 bin 子目录下,为方便使用,可以将该 DOS 命令放到一个批处理文件中(设为 MyChatServer.bat)。打开记事本,输入批处理命令:C:j2sdk1.4.2_14bi

21、njava MyChatServer保存时,选择文件位置为“网络聊天室”文件夹,文件类型为“所有文件(*.*)”,文件名为“MyChatServer.bat”,文件名可以随意,但扩展名必须是“.bat”。运行时,在“我的电脑”中的“网络聊天室”文件夹下,双击该批处理文件即可。137 /关闭当前连接 socketa.close();catch(IOException eee)System.out.prln(name+用户离开了); break; /结束本线程2)客户端程序的整体框架138import java.awt.*; import java.io.*; import .*; import

22、java.applet.*;import java.util.Hashtable;public class MyCntChat extends Applet implements Runnable/客户端套接字对象/服务器信息的输入流/向服务器发送信息的输出流/用户提交昵称界面/用户聊天界面/存放聊天者昵称的散列表Label 提示条;/ 显示提示信息组件Panel north, center;Thread thread;/客户端启动的线程 public void init()this.setBackground(Color.pink); width=getSize().width;/获取当前容

23、器 Applet 的宽 height=getSize().height; /获取当前容器 Applet 的高/创建对象setLayout(new BorderLayout(); /设置布局用户提交昵称界面=new InputNameTextField(listTable); h=用户提交昵称界面.getSize().height;用户聊天界面=new ChatArea(,listTable,width,height-(h+5);/设置用户聊天界面不可见提示条=new Label(正在连接到服务器,请稍等.);提示条.setForeground(Color.red);north=nenel(ne

24、w FlowLayout(FlowLayout.LEFT); center=nenel();nordd(用户提交昵称界面);nordd(提示条); center.add(用户聊天界面);add(north,BorderLayout.NORTH); add(center,BorderLayoENTER);/确认容器对它的组件进行布局public void start()if(socket!=null&in!=null&out!=null)/清除此前的套接字信息 try/关闭套接字/关闭输入流/关闭输出流/关闭用户聊天界面139catch(Exception ee)try/端口 3333 获得服务

25、器端的 IP 地址/获得输入流进行读操作/获得输出流进行写操作catch (IOException ee)提示条.setText(连接失败);if(socket!=null)/获取服务器端地址提示条.setText(连接:+address+成功);用户提交昵称界面.setSocketConnection(socket,in,out); north.validate(); /确认当前容器和对其所有子组件布局if(thread=null) /启动新线程thread=new Thread(this);/线程启动public void stop()trysocket.close(); thread=n

26、ull;catch(IOException e)this.showSus(e.toString();public void run()while(thread!=null)if(用户提交昵称界面.get 能否聊天()=true)/显示用户聊天界面用户聊天界面.setName(用户提交昵称界面.getName(); 用户聊天界面.setSocketConnection(socket,in,out);提示条.setText(祝您聊天愉快!); center.validate(); /确认容器和它的所有子组件140break;tryThread.sleep(100);catch(Exception

27、e)* import java.awt.*;import .*; import java.awt.event.*; import java.io.*;import java.util.Hashtable;public class ChatArea extends Panel implementionListener,RunnableSocket socket=null;/与服务器端建立连接的套接字 DataInputStream in=null; /服务器信息的输入流 DataOutputStream out=null; /向服务器发送信息的输出流/服务器信息的线程/公聊显示区、私聊显示区/输

28、入聊天内容/发送内容、刷新公聊区和刷新私聊区 Label 提示条=null;String nall;/聊天者昵称Hashtable listTable;/存放聊天者昵称的散列表/显示全部聊天者的昵称的列表框组件/选择私聊者的下拉列表width,height;/聊天区的宽和高/创建聊天界面public ChatArea(String name,Hashtable listTable,width,height)setLayout(null); setBackground(Color.pink); this.width=width; this.height=height; setSize(width

29、,height); this.listTable=listTable; =name; threadMessage=new Thread(this);公聊显示区=new TextArea(10,10);私聊显示区=new TextArea(10,10);确定=new Button(发送信息到:);刷新公聊区=new Button(刷新公聊区);刷新私聊区=new Button(刷新私聊区);141提示条=new Label(双击聊天者可私聊,Label.CENTER);送出信息=new TextField(28);确定.addActionListener(this);送出信息.

30、addActionListener(this); 刷新公聊区.addActionListener(this);刷新私聊区.addActionListener(this);ponent=new List();/双击列表中的昵称可选中聊天者与之进行私聊 privateChist=new Choice(); privateChist.add(大家(*);/默认用户输入内容发给所有聊天者add(公聊显示区);公聊显示区.setBounds(10,10,(width-120)/2,(height-120); add(私聊显示区);私聊显示区.setBounds(10+(width-120)/2,10,(

31、width-120)/2,(height-120); add(ponent);ponent.setBounds(10+(width-120),10,100,(height-160); add(提示条);提示条.setBounds(10+(width-120),10+(height-160),110,40); Panel pSouth=nenel();pSoudd(送出信息);pSoudd(确定);pSoudd(privateChist); pSoudd(刷新公聊区);pSoudd(刷新私聊区); add(pSouth);pSouth.setBounds(10,20+(height-120),w

32、idth-20,60);public void setName(String s)name=s;/与服务器建立套接字连接public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)this.socket=socket; this.in=in; this.out=out;try /启动线程catch(Exception e)/处理事件public void actionPerformed(ActionEvent e)142if(e.getSource()=确定|e.getSource(

33、)=送出信息)String message=;String people=privateChist.getSelectedItem();/获取对象的昵称 message=送出信息.getText(); if(message.length()0)/将聊天内容发送给服务器try if(people.equals(大家)out.writeUTF(公共聊天内容:+name+说:+message);elseout.writeUTF(私人聊天内容:+name+悄悄地说:+message+#+people);catch(IOException event)else if(e.getSource()ponen

34、t)privateChist.insert(ponent.getSelectedItem(),0); privateChist.repa();else if(e.getSource()=刷新公聊区)公聊显示区.setText(null);else if(e.getSource()=刷新私聊区)私聊显示区.setText(null);/服务器信息public void run()while(true)String s=null; try/等待服务器信息if(s.startsWith(聊天内容:)/服务器发来的信息String content=bstring(s.indexOf(:)+1);143

35、公聊显示区.append(n+content);if(s.startsWith(私人聊天内容:)/服务器发来的信息String content=bstring(s.indexOf(:)+1);私聊显示区.append(n+content);else if(s.startsWith(聊天者:)String people=bstring(s.indexOf(:)+1,s.indexOf(); String sex=bstring(s.indexOf()+2); listTable.put(people,people+(+sex+);ponent.add(String)listTable.get(p

36、eople);/刷新 List,显示新用户昵称else if(s.startsWith(用户离线:)/删除离线用户信息String awayPeopleName=bstring(s.indexOf(:)+1); ponent.remove(String)listTable.get(awayPeopleName); ponent.repa();公聊显示区.append(n+(String)listTable.get(awayPeopleName)+离线);listTable.remove(awayPeopleName);Thread.sleep(5);catch(IOException e)/服

37、务器关闭套接字连接时,导致异常ponent.removeAll(); ponent.repa();listTable.clear();公聊显示区.setText(与服务器的连接已中断n 必须刷新浏览器才能再次聊天); break;catch(erruptedException e)* import java.awt.*;import .*; import java.awt.event.*; import java.io.*;import java.util.Hashtable;public class InputNameTextField extends Panel implementionL

38、istener,Runnable144/输入昵称的文本框/选择的单选框Button 进入聊天室=null,退出聊天室=null;/选择进入、退出聊天室/客户端套接字/服务器发来的信息/向服务器发送消息/负责服务端信息的线程能否聊天=false;/判断能否聊天Hashtable listTable;/存放聊天者昵称的散列表/创建用户输入昵称界面public InputNameTextField(Hashtable listTable)this.setBackground(Color.pink); this.listTable=listTable; nameFile=new TextField(1

39、0); group=new CheckboxGroup();male=new Checkbox(男,true,group);female=new Checkbox(女,false,group);进入聊天室=new Button(进入聊天室);退出聊天室=new Button(退出聊天室);进入聊天室.addActionListener(this);退出聊天室.addActionListener(this);thread=new Thread(this); add(new Label(昵称:); add(nameFile);add(male); add(female); add(进入聊天室);a

40、dd(退出聊天室);退出聊天室.setEnabled(false);/设置能否聊天public void set 能否聊天(b)能否聊天=b;/判断能否聊天publicget 能否聊天()return 能否聊天;/获取聊天者的昵称public String getName()return name;/设置聊天者的昵称public void setName(String s)145name=s;public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)this.socket=sock

41、et; this.in=in; this.out=out;try /启动线程thread.start();catch(Exception e)nameFile.setText(+e);public Socket getSocket()return socket;public void actionPerformed(ActionEvent e)if(e.getSource()=进入聊天室)退出聊天室.setEnabled(true); if(能否聊天=true)nameFile.setText(您正在聊天:+name);elsethis.setName(nameFile.getText();S

42、tring sex=group.getSelectedCheckbox().getLabel(); if(socket!=null&name!=null)tryout.writeUTF(:+name+:+sex);catch(IOException ee)nameFile.setText(没有连通服务器+ee);if(e.getSource()=退出聊天室)try客户端程序由 3 个 Java 源程序组成。ChatArea 类和 InputNameTextField 类依赖于主类 MyC ntChat,主类负责创建网络聊天室客户端的 Java Applet 小程序,如与服务器连接成功,程序则做

43、出相应提示并显示输入昵称界面;当用户输入昵称后,进入用户聊天界面,可以看到聊天者列表、公聊区、私聊区;用户在文本框中输入信息后,就可以进行公聊或私聊。InputNameTextField 类主要负责向服务器发送当前聊天者的昵称,获取其他聊天者的昵称,并将所有聊天者的昵称添加到列表中。ChatArea 类负责管理客户聊天界面,该界面146out.writeUTF(用户离开:);catch(IOException ee)public void run()String message=null; while(true)if(in!=null)trymessage=in.readUTF();catch

44、(IOException e)nameFile.setText(和服务器断开+e);if(message.startsWith(可以聊天:)能否聊天=true; break;else if(message.startsWith(聊天者:)String people=message.substring(message.indexOf(:)+1); listTable.put(people,people);/将目前的聊天者昵称添加到散列表中else if(message.startsWith(不可以聊天:)能否聊天=false;nameFile.setText(该昵称已被占用);可以把当前聊天者要

45、发送的给所有聊天者或指定聊天者;也可以其他人的信息,并可以判断是公聊信息还是私聊信息,然后分别显示在相应的聊天区域。由于客户端程序主类继承了 Applet 类,因而引入了 java.applet 包;3 个类中由于使用了实现套接字类 Socket,因而引入了 包;由于使用了组件,因而引入了 java.awt包;使用了数据输出流类 DataOutputStream、数据输入流类 DataInputStream,因而引入了 java.io 包;使用了哈希表类 Hashtable,因而引入了 java.util.Hashtable 类;由于有事件处理,因而引入了 java.awt.event 包。程

46、序的编程要点已在整体框架中标出,在 5.1.3 节中将会详细。前面已建“D:网络聊天室”文件夹,将客户端程序的 3 个*.java 文件和编译好生成的所有字节码*.class 文件都放在该文件夹中。打开 JCreator(也可使用其他的 Java 代码编辑器或集成开发工具),单击上的【New】按钮,在出现的框中选择【Files】选,在该选上选择【Java File】选项,输入程序名“MyCntChat”,并选择工作位置为“网络聊天室”文件夹,单击【确定】按进入编辑器。输入前面的程序整体框架,其中注释说明部分的代码,在 5.1.3 节中可以查到,全部代码输入完成并检查无误后单击File】菜单命令

47、进行编译,上的【Save】按钮保存文件。选择【Build】|【Compile错误,可按照编译提示信息进行修改,然后保存并重新编译,直到提示“Pros completed”,编译成功。设计一个简单的包含 Applet 标记的网页(MyCntChat.html),代码如下:打开 JCreator(也可使用其他的 HTML 代码编辑器或可视化设计器),单击上的【New】按钮,在出现的框中选择【Files】选,在该选上选择【HTML File】选项,输入网页文件名“MyCntChat”,并选择工作位置为“网络聊天室”文件夹,单击【确定】按进入编辑器。输入上述代码,检查无误后单击上的【Save】按钮保存

48、文件,在“网络聊天室”文件夹中将出现 MyCntChat.html 文件,网页制作完成。使用 IE 打开网页即可运行其中的 Applet 程序。也可使用Java JDK 提供的AppletViewer 工具打开网页,只运行网页上的Applet 成分,在 DOS 控制台转到“网络聊天室”,输入以下命令:C:j2sdk1.4.2_14binAppletViewer MyCntChat.html为方便使用,可以将该 DOS 命令放到一个批处理文件中(设为 MyC nChat.bat)。打开记事本,输入上述命令,保存时,选择文件位置为“网络聊天室”文件夹,文件类型为“所有文件(*.*)”,文件名为“M

49、yC nChat.bat”,文件主名可以随意,但扩展名必须是“.bat”。147运行时,在“电脑”中的“网络聊天室”文件夹下,双击该批处理文件即可。5.1.3代码及分析在程序的整体框架中,说明编程要点的注释部分对应的代码及分析如下。1) 服务器端程序(1)在 main 方法中。(2)在 Server_thread 类中的域。(3)在 Server_thread 构造方法中。(4)在 run 方法中。148/等待客户端发来的信息 s=in.readUTF();/截取昵称name=bstring(s.indexOf(:)+1,s.indexOf();/截取sex=bstring(s.lastInd

50、exOf(:)+1);/检查散列表中是否已有截取到昵称的聊天者 boo=peopleList.containsKey(name);/通过 OUT 向线路写入信息out.writeUTF(可以聊天:);/获取所有与客户端通信的服务器线程/对得到的输入流进行读操作in=new DataInputStream(socketa.getInputStream();/对输出流进行写操作out=new DataOutputStream(socketa.getOutputStream();/文件对象File file=null;/数据输出流 DataOutputStream out=null;/数据输出流Da

51、taInputStream in=null;/客户端呼叫ServerSocket server=null;/与客户端套接字建立起连接的服务器端套接字 Socket socket=null;/存放与各聊天者客户端通信的服务器线程的散列表Hashtable peopleList;/创建一个 ServerSocket 在端口 3333客户请求server=new ServerSocket(3333);/与客户端通信而启动的服务器端线程Server_threeopleThread=new Server_thread(socket,peopleList);/服务器端线程启动peopleThread.st

52、art();在服务器端程序中,存放与各聊天客户端通信的服务器线程的散列表使用 Hashtable 类实现,该散列表将键定义为相应的值。任何非 null 对象都可以用作键或值。将昵称添加到散列表时调用 put 方法,从散列表中移去昵称时调用 remove 方法,指定私聊者昵称时调用 get 方法。Server_thread 类是java.lang.Thread 类的子类,Thread 类是负责向其他类提供线程支持的最主要的类,要使一个类具有线程功能,在Java 中只要简单地从Thread 类派生一个子类就可以了;Thread 类最重要的方法是 run 方法。run 方法是新线程执行的方法,因此生

53、成 java.lang.Thread 的子类时,必须有相应的 run 方法。启动线程需调用 start 方法实现。使用过滤流DataInputStream、DataOutputStream 为输入/输出流,调用getInputStream()方法获得输入流,调用getOutputStream 方法获得输出流。为了防止传输中文信息时产生乱码,使用 readUTF 方法和 writeUTF 方法进行读和写信息。2) 客户端程序(1) 在 MyCntChat 类中。域:init 方法:149/获取当前容器 Applet 的宽width=getSize().width;/获取当前容器 Applet 的

54、高height=getSize().height;/客户端套接字对象 Socket socket=null;/服务器信息的输入流DataInputStream in=null;/向服务器发送信息的输出流 DataOutputStream out=null;/用户提交昵称界面InputNameTextField 用户提交昵称界面=null;/用户聊天界面ChatArea 用户聊天界面=null;/存放聊天者昵称的散列表Hashtable listTable;/客户端启动的线程Thread thread;Enumeration enums=peopleLisements();/删除昵称 peopl

55、eList.remove(name);/关闭当前连接socketa.close();/结束线程 break;/通知当前用户接受私聊的用户已经离线out.writeUTF(私人聊天内容:+toPeople+已经离线);start 方法:run 方法:(2) 在 ChatArea 类中。域:150/服务器信息的线程Thread threadMessage=null;/公聊显示区、私聊显示区TextArea 公聊显示区,私聊显示区=null;/输入聊天内容TextField 送出信息=null;/负责发送内容、刷新公聊区和刷新私聊区 Button 确定,刷新公聊区,刷新私聊区;/存放聊天者昵称的散列

56、表 Hashtable listTable;/显示全部聊天者的昵称的列表框组件Listponent=null;/选择私聊者的下拉列表Choice privateChist;/显示用户聊天界面用户聊天界面.setVisible(true);/关闭套接字 socket.close();/关闭输入流in.close();/关闭输出流 olose();/关闭用户聊天界面用户聊天界面.setVisible(false);/端口 3333 获得服务器端的 IP 地址socket = new Socket(this.getCodeBase().getHost(), 3333);/获得输入流进行读操作in=n

57、ew DataInputStream(socket.getInputStream();/获得输出流进行写操作out=new DataOutputStream(socket.getOutputStream();/获取服务器端地址InetAddress address=socket.getInetAddress();/线程启动thread.start();/创建对象listTable=new Hashtable();/设置用户聊天界面不可见用户聊天界面.setVisible(false);/确认容器对它的组件进行布局validate();构造方法 ChatArea:setSocketConnect

58、ion 方法:actionPerformed 方法:3)在 InputNameTextField 类中的域在客户端程序中,实现多线程的方法是实现 Runnable 接口,通过实现 Runnable 接口的方法创建每一个对象的线程。为实现 Runnable 接口,一个类仅需实现一个 run 方法,启动线程仍调用 start 方法。在使用语句 socket=new Socket(this.getCodeBase().getHost(),3333)实现从端口 3333 获得服务器端IP 地址时,要注意在建立Socket 连接时,服务器端和客户端的端致,否则建立不了连接,并且必须有主机 IP 地址或主

59、机名参数。必须设为一在读/写信息方面与服务器端的解决方法相同,已在服务器程序分析中叙述过。5.1.4相关知识1. 多线程支持多线程技术是Java 语言的重要特点,多线程是相对于进程或单线程而言的,它具有并发性、执行效率高的特点。在多线程机制中,不同的线程处理不同的任务,它们之间151/输入昵称的文本框 TextField nameFile=null;/选择的单选框Checkbox male=null,female=null;/客户端套接字Socket socket=null;/服务器发来的信息DataInputStream in=null;/向服务器发送消息 DataOutputStream out=null;/负责服务端信息的线程Thread thread=null;/获取对象的昵称people=people.substring(0,people.indexOf();/等待服务器信息 s=in.readUTF();/刷新 List,显示新用户昵称ponent.repa();/启动线程threadMessage.start();/双击列表中的昵称可选中聊天者与之进行私聊 ponent.addActionListener(this);/默认用户输入内容发给所有聊天者privateChist.select(0);互不,不会由于一个线程的等待而影响其他线程的运行,这样容易实现网络上

温馨提示

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

评论

0/150

提交评论