
案例九:简单的聊天程序 教学目的: 巩固a时与事件处理部分的相关知鼠: 巩固输入输出部分的相美知识: 熟悉Socket通信: 修够编写简单的客户/服务馨通信程序。 设计要求: 编写一个图形界而的A如olication程序,用以实现常见的聊天功能,仅考虑一对一的聊 天。 案例副析 获取网络上资源的步霉如下: 创建一个URL类型的对象 利用URL类的openstream,获得对应的InputStream类的对象,如:将InputStream 对象转化为DatalnputStream类的对象 读取内容 但它不适合牌天程序。 柳天程序适合使用套接字米处理,在套接字中将会涉及到输入流和输出流的操作,要注 意关输入输出流的注意顺序,同时可考虑线程的使用,以速免影响其也程序的运行: 注意在双方的通信过程中将涉及以下三个步骤:与通信对象的连接,发送信息,关闭连 接。 参考代码 客户端ChatClien成.a,建立客户端以获取服务卷帽发送信息并显示 import java.io."; import java.net.; import java.awt. import java.awt.event.; import javax swing-"; public class Chatclient extends JFrame private JTextField inputBox:
案例九:简单的聊天程序 教学目的: 巩固 awt 与事件处理部分的相关知识; 巩固输入输出部分的相关知识; 熟悉 Socket 通信; 能够编写简单的客户/服务器通信程序。 设计要求: 编写一个图形界面的 Application 程序,用以实现常见的聊天功能,仅考虑一对一的聊 天。 案例剖析 获取网络上资源的步骤如下: 创建一个 URL 类型的对象 利用 URL 类的 openStream(),获得对应的 InputStream 类的对象,如: 将 InputStream 对象转化为 DataInputStream 类的对象 读取内容 但它不适合聊天程序。 聊天程序适合使用套接字来处理,在套接字中将会涉及到输入流和输出流的操作,要注 意关闭输入输出流的注意顺序,同时可考虑线程的使用,以避免影响其他程序的运行; 注意在双方的通信过程中将涉及以下三个步骤:与通信对象的连接,发送信息、关闭连 接。 参考代码 客户端 ChatClient.java,建立客户端以获取服务器端发送信息并显示 import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChatClient extends JFrame { private JTextField inputBox;

private JTextArea outframe; private ObjectOutputStream output5. private Objectinputstream inputs; private String message="; private String chatserver. private Socket todient; ∥初始化牌天服务 public ChatClent(String snvhost super("Chent" chatServer srhost; ∥设置客户端连接的服务器 Container container getContentPane0: inputBox=new JTextField(); 建立输入框 inputBox.setEnabled(false]: inputBox.addActionListener( ∥监所 new ActionListener public void actionPerformed(ActionEvent event sendMsg(event.getActionCommand()): ∥向服务落端发送消息 上 container.add inputBax,BorderLayout.NORTH ] outFrame new JTextArea(l: container.add(new JScroliPane(outFrame ) BorderLayout.CENTER
private JTextArea outFrame; private ObjectOutputStream outputS; private ObjectInputStream inputS; private String message = ""; private String chatServer; private Socket toclient; // 初始化聊天服务 public ChatClient( String srvhost ) { super( "Client" ); chatServer = srvhost; // 设置客户端连接的服务器 Container container = getContentPane(); inputBox = new JTextField(); // 建立输入框 inputBox.setEnabled( false ); inputBox.addActionListener( //监听 new ActionListener() { public void actionPerformed( ActionEvent event ) { sendMsg( event.getActionCommand() ); } // 向服务器端发送消息 } ); container.add( inputBox, BorderLayout.NORTH ); outFrame = new JTextArea(); container.add( new JScrollPane( outFrame ), BorderLayout.CENTER );

setSire(280,160 setVisible(true ∥输出输出框 1 ∥连接服务器痛 public woid connectcliento 1 try[ 创建用于连接的5 ocket connect2Server ∥得到输入输出流 get设reams H建立连接 processConnection(): ∥关闭连接 claseConnection: catch(EOFException eofException ) System.out.printin"Server terminated connection"): catch(IOException ioException icException.printStackTrace(l: 1 指获异常 1 获取输入输出流 private void getstreams()throws IOException H输出 outputs new ObjectOutputStream(
setSize( 280, 160 ); setVisible( true ); // 输出输出框 } // 连接服务器端 public void connectClient() { try { // 创建用于连接的 Socket connect2Server(); // 得到输入输出流 getStreams(); // 建立连接 processConnection(); // 关闭连接 closeConnection(); } catch ( EOFException eofException ) { System.out.println( "Server terminated connection" ); } catch ( IOException ioException ) { ioException.printStackTrace(); } //捕获异常 } // 获取输入输出流 private void getStreams() throws IOException { // 输出 outputS = new ObjectOutputStream(

toclient.getOutputStream()): outputS.flush(): H输入 inputs new Objectinoutstream( toclient.getinputStream()): outFrame.append("nGet l/O streams\n" ∥连接服务器瑞 private void connect2Server0 throws IOException outFrame.setText(连接中…nr toclient new Socket( InetAddress.getByName(chatServer )4000 ) ∥莲接信息显示 outFrame.append("选接至:”+ toclient.getinetAddress(].getHostName(): private void processConnection()throws lOException 1 ∥输出图 inputBox.setEnabled(true ) do( ∥读入信息并输出 try message-(String inputs.readobject(l outFrame.append("\n"message outFrame.setCaretPosition outFrame.getText().length(1: catch[ClassNotFoundException classNotFoundException
toclient.getOutputStream() ); outputS.flush(); // 输入 inputS = new ObjectInputStream( toclient.getInputStream() ); outFrame.append( "\nGet I/O streams\n" ); } // 连接服务器端 private void connect2Server() throws IOException { outFrame.setText( "连接中……\n" ); toclient = new Socket( InetAddress.getByName( chatServer ), 4000 ); // 连接信息显示 outFrame.append( "连接至: " + toclient.getInetAddress().getHostName() ); } private void processConnection() throws IOException { // 输出框 inputBox.setEnabled( true ); do { // 读入信息并输出 try { message = ( String ) inputS.readObject(); outFrame.append( "\n" + message ); outFrame.setCaretPosition( outFrame.getText().length() ); } catch ( ClassNotFoundException classNotFoundException ) {

outFrame.append("nUnknown object type received") ]while(Imessage.equals('服务器端>TERMINATE')上 1 ∥关闭输入输出流、关闭连接,注意顺序 private void closeConnection()throws IOException outFrame.append域n关闭连接" output5 closel]: input5.closell toclient.close(l: ∥给凰务器端发消息 private void sendMsg(String message try( output5 writeObject"客户>"+me5sage上 output5.flush): outFrame,.append("\n客户瑞>”+mes5agek / catch(IOException ioException outFrame.append("\nError writing object" 1 /maln0方法 public static void main(String args[) ChatClient beginning: if(args.length=0】 beginning new ChatChent("127.0.0.1"):
outFrame.append( "\nUnknown object type received" ); } } while ( !message.equals( "服务器端>> TERMINATE" ) ); } //关闭输入输出流、关闭连接,注意顺序 private void closeConnection() throws IOException { outFrame.append( "\n 关闭连接" ); outputS.close(); inputS.close(); toclient.close(); } // 给服务器端发消息 private void sendMsg( String message ) { try { outputS.writeObject( "客户端>> " + message ); outputS.flush(); outFrame.append( "\n 客户端>>" + message ); } catch ( IOException ioException ) { outFrame.append( "\nError writing object" ); } } //main()方法 public static void main( String args[] ) { ChatClient beginning; if ( args.length == 0 ) beginning = new ChatClient( "127.0.0.1" );

else beginning new ChatClent(args[0 beginning.setDefaultCloseOperation( JFrame.E0 T_ON_CLO0SE上 beginning.connectClent(): 1 聊天程序之服务器斓Cat5 erver.java:建立服务器端,接收客户端连接,发送信息、关 闭连接。 import java.io."; import java.net.; import java.awt.'; import java.awt.event.*; import javax swing: public class ChatServer extends JFrame{ private JTextField inputBox; private JTextArea outFrame: private ObjectOutputStream outputs, private Objectinputstream inputs; private ServerSocket toserver: private Socket connection private int counter 1; public ChatServer() super("Server"]: Container container getContentPane0: inputBox new JTextField(); inputBox.setEnabled(false]: /输出 inputBox.addActionListener
else beginning = new ChatClient( args[ 0 ] ); beginning.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); beginning.connectClient(); } } 聊天程序之服务器端 ChatServer.java: 建立服务器端,接收客户端连接,发送信息、关 闭连接。 import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChatServer extends JFrame { private JTextField inputBox; private JTextArea outFrame; private ObjectOutputStream outputS; private ObjectInputStream inputS; private ServerSocket toserver; private Socket connection; private int counter = 1; public ChatServer() { super( "Server" ); Container container = getContentPane(); inputBox = new JTextField(); inputBox.setEnabled( false ); //输出 inputBox.addActionListener(

∥监听 new ActionListener[)《 H发送信皂 public void actionPerformed(ActionEvent event sendMsg(event.getActionCommand() 上 container.add(inputBax BorderLayout.NORTH ] ∥输出医 outFrame new JTextArea(l container.add new JScrollPane(outFrame) BorderLayout.CENTER ) s0t50e(280,160 setVisible(true ) 1 ∥处理连接 public void connectServer[) try( H创建一个5 erver5oket. toserver new ServerSocket 4000,100 ) wtle(true】{ ∥等待连接 wait4Connection(l: ∥获取输入输出流 getStreams() ∥处理连接 processConnection(l:
//监听 new ActionListener() { // 发送信息 public void actionPerformed( ActionEvent event ) { sendMsg( event.getActionCommand() ); } } ); container.add( inputBox, BorderLayout.NORTH ); // 输出框 outFrame = new JTextArea(); container.add( new JScrollPane( outFrame ), BorderLayout.CENTER ); setSize( 280, 160 ); setVisible( true ); } // 处理连接 public void connectServer() { try { // 创建一个 ServerSocket. toserver = new ServerSocket( 4000, 100 ); while ( true ) { // 等待连接 wait4Connection(); // 获取输入输出流 getStreams(); // 处理连接 processConnection();

∥关闭连接 closeConnection(l ++counter; 1 catch EOFException eofException ) System.out.printin("Client terminated connection" 1 插获异常 catch(IOException ioException icException.printStackTrace(l: 】 private void wait4Connection[)throws lOException outFrame,.setText(等特连接一n上 connection toserver.accept/) outFrame,append("Connection·+counter◆ "from:" connection.getinetAddress()getHostName( 1 private void getStreams()throws IOException 1 ∥设置输出流 outputs new ObjectOutputStream( connection.getOutputstream) 上 outputS.flush(): ∥设置输入流
// 关闭连接 closeConnection(); ++counter; } } catch ( EOFException eofException ) { System.out.println( "Client terminated connection" ); } //捕获异常 catch ( IOException ioException ) { ioException.printStackTrace(); } } private void wait4Connection() throws IOException { outFrame.setText( "等待连接……\n" ); connection = toserver.accept(); outFrame.append( "Connection " + counter + "from: " + connection.getInetAddress().getHostName() ); } private void getStreams() throws IOException { // 设置输出流 outputS = new ObjectOutputStream( connection.getOutputStream() ); outputS.flush(); // 设置输入流

inputs new ObjectinputStream( connection.getinputstream) 上 outFrame.append("\nGet 1/O streams\n"): 1 ∥处理客户端连接 private void processConnectionl)throws IOException ∥莲接成功 String message="服务器瑞>连接成功: output5 writeobject(message]: outputS.flush(): H输入医 inputBox.setEnabled[true ) ∥处理米自客户端的信息 do( ∥读取清息 try[ message String inputs.readobject(l; outFrame,append域"n°+message月 outFrame.setCaretPositionl outFrame.getTextl).length(] 1 catch(ClassNotFoundException classNotFoundException ) outFrame.append("\nUnknown object type received"): 】while(Imes5 age.equ因("客户W>TERMINATE"]上 ∥关闭socket
inputS = new ObjectInputStream( connection.getInputStream() ); outFrame.append( "\nGet I/O streams\n" ); } //处理客户端连接 private void processConnection() throws IOException { // 连接成功 String message = "服务器端>> 连接成功"; outputS.writeObject( message ); outputS.flush(); // 输入框 inputBox.setEnabled( true ); // 处理来自客户端的信息 do { // 读取消息 try { message = ( String ) inputS.readObject(); outFrame.append( "\n" + message ); outFrame.setCaretPosition( outFrame.getText().length() ); } catch ( ClassNotFoundException classNotFoundException ) { outFrame.append( "\nUnknown object type received" ); } } while ( !message.equals( "客户端>> TERMINATE" ) ); } // 关闭 socket

private void closeConnectionl)throws IOException outFrame.append("\nUser terminated connection" inputBox.setEnabled(false]: outputS.closeD): inp5cko5e业 connection.clasel): ∥向客户端发送消息 private void sendMsg(String message) try[ output5 writeObject“服务器端>o"+message outputS.flush(): outFrame..append("n服务器端>+mes5age上 1 catch(IOException ioException){ outFrame.append("\nError writing object" 〉 ∥main(方法 public static void main(String args[) ChatServer process new Chatserver(l process.setDefaultCloseOperation( JFrame,E0TCN0sE出 process.connectServer(): 】/∥end class ChatServer
private void closeConnection() throws IOException { outFrame.append( "\nUser terminated connection" ); inputBox.setEnabled( false ); outputS.close(); inputS.close(); connection.close(); } // 向客户端发送消息 private void sendMsg( String message ) { try { outputS.writeObject( "服务器端>> " + message ); outputS.flush(); outFrame.append( "\n 服务器端>>" + message ); } catch ( IOException ioException ) { outFrame.append( "\nError writing object" ); } } // main()方法 public static void main( String args[] ) { ChatServer process = new ChatServer(); process.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); process.connectServer(); } } // end class ChatServer