
案例四:简单的聊天程序 所属章节:网络编程应用 教学目的: 巩固t与事件处理部分的相关知识: 巩固输入输出部分的相关如识: 熟悉Socket通信: 能够编写简单的客户/服务器通信程序。 设计要求: 编写一个图形界面的pplication程序,用以实现常见的幕天功能,仅考虑一对一的鞠 天。 案例剂析 获取网络上资尊的步露如下: 1,创建一个风类型的对象 2.利用L类的open5 trean(O,获得对应的1nput5 trean类的对象,如: 3将1 nputStrean对象转化为DataInputStream类的对象 4读取内容 但它不适合聊天程序。 5聊天程序适合使用套接字米处理,在套接字中将会涉及到输入流和输出流的操作,要 注意关闭输入输出流的注意顺序,阿时可考虑线程的使用,以看免影响其他程序的运行:注 意在双方的通信过程中将涉及以下三个步露:与通信对象的连接,发送信息、关闭连接,参 考代码 I.客户端ChatClient..java,建立客户端以获取服务器端发送信息并显示 inport java.io.: f国ort java,let,*: i国p0 rt java.agt.来: inport java.agt.event.◆; Ip0 rt Javax,w1ng,*月 public class ChatClient extends JFrane private JTextField inputBox:
案例四:简单的聊天程序 所属章节:网络编程应用 教学目的: 巩固 awt 与事件处理部分的相关知识; 巩固输入输出部分的相关知识; 熟悉 Socket 通信; 能够编写简单的客户/服务器通信程序。 设计要求: 编写一个图形界面的 Application 程序,用以实现常见的聊天功能,仅考虑一对一的聊 天。 案例剖析 获取网络上资源的步骤如下: 1.创建一个 URL 类型的对象 2.利用 URL 类的 openStream(),获得对应的 InputStream 类的对象,如: 3.将 InputStream 对象转化为 DataInputStream 类的对象 4.读取内容 但它不适合聊天程序。 5.聊天程序适合使用套接字来处理,在套接字中将会涉及到输入流和输出流的操作,要 注意关闭输入输出流的注意顺序,同时可考虑线程的使用,以避免影响其他程序的运行; 注 意在双方的通信过程中将涉及以下三个步骤:与通信对象的连接,发送信息、关闭连接。参 考代码 1.客户端 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 outFrane: private ObjectOutputStrean outputS: private ObjectInputStrean inputs: private String message ="" private String chatServer: private Socket toclient: ∥初始化聊天服务 public ChatClient String srvhost { super("Client"): chatServer srvhost: ∥设置客户端连接的服务器 Container container getCoatentPane(): inputBox new JTextField(): /∥建立输入框 inputBox.setEnabled(false ) inputBox.addAct ionListener( /监听 new ActionListener( public void actionPerforned(ActionEvent event sendVsg(event.getActionComnand()) ∥向服务器端发送消息 : container.add(inputBox,BorderLayout.NORTH outFrane nev JTextArea(): container.add(new JScrollPane outFrane ) 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 );

0tS1xe(280.160): setVisible(true ) ∥输出输出框 1 ∥连接服等器端 public void comneetClient( { try( /∥创建用于连接的Socket connect2Server0: ∥得到输入输出滴 getStreams(): ∥建立连接 processConnection(): ∥关闭连接 closeCoenectio通0: 1 catch EOFException eofException System out.println("Server terminated connection") catch I0Exeeption ioException ) ioException.printStackTrace(: /辅获异常 1 ∥获取输入输出流 private void getStreams()throws IOException ∥输出 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.getOutputStrean(): outputS.flushO: ∥输入 inputs new ObjectInputStrean( toclient.getInputStrean()) outFrane.append("\nGet I/0 streans'\n") 1 /∥连接服务器瑞 private void connect2Server()throws I0Exception o闻tFrame.setText(“连接中-n”): toclient nev Socket( InetAddress.etByNane(chatServer),40o0): /∥连接信息显示 o陶tFrame.append(“连接至:”+ toclient.getInetAddress().getHostNane()): 1 private void processConnection()throws I0Exception ∥输出框 inputBox.setEnabled(true ) 的f ∥读入信息并输出 try( message String inputS.readobjectO: o陶tFrane.append("n”+essage): outFrane.setCaretPosition( outFrame.getText ()lemgth()) 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("\nnknowm object type received") }hile(!nessage,.equals("服务器瑞>TERMINATE”)): /关闭输入输出流、关闭连接。注意顺序 private void closeConmection()throws I0Exception o陶tFrane.append(n关闭连接”): 0陶tputS.close0: inputS.close(: toclient.close(; 1 ∥给服务器端发消显 private void sendysg(String message { try o陶tput5T1te06ject("客户端>”+到ssa8e): outputS.flush(: 0陶tFrane.ppend("n客户瑞>”+essage): catch IOException ioException ) outFrame.append("\nError writing object"); 】 f/aain0方法 public static void main(String args[] { ChatClient heginning: if(args.length=0) beginning nev Chatclient("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 ChatClient(args[0】): beginning.setDefaultClose0peration JFrane.EXIT_ON_CLOSE beginning.connectClient(); 1 1. 幕天程序之服务器端Qat5erer,jra:建立服务器烟,接收客户端违 接:发送信息、关闭连核。 i国p0 rt java.ia*: inport java.net.◆: import java,awt.◆: inport java.avt.event.*: inport javax.swing.◆: public class ChatServer extends JFrane private JTextField inputBox: private JTextArea outFrane: private Ob jectoutputStrean outputs: private ObjectInputStrean imputs: private ServerSocket toserver: private Socket conneetion: private int counter "1; public ChatServer ( super("Server”): Container container getCoatentPane() inputBox nev JTextField(): inputBor.setEnabled(false ) /输出 inputBox.addActionListener(
else beginning = new ChatClient( args[ 0 ] ); beginning.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); beginning.connectClient(); } } 1. 聊天程序之服务器端 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([ ∥发送信息 public void actionPerforned(ActionEvent event sendMsg(event.getActionComnand()): 1 : container.add(inputBox,BorderLayout.NORTH ) 输出框 outFrame new JTextArea(): container.add《new JScrollPane(out Frane), BorderLayout.CENTER ) set5ixe(280.160): setVisible(true ) 1 ∥处理连接 public void comnectServer() try( /∥创建一个ServerSocket.. toserver nev ServerSocket 4000.100 ) while true ∥等待连接 gait4 Comnectio道0: ∥获取输入输出流 cetStreams(): ∥处理连接 processConnection():
//监听 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();

∥关闭连接 closeCoanection(: ++counter: 1 1 catch EOFException eofException ) Systen out.println("Client terminated connection"): 1 /铺获异常 catch IOException ioException ) ioException.printStackTrace(: private void waitdConnection()throws IOException o陶tFrane.setText(“等待连接-n”): connection toserver.accept () o陶tFrane.append(“Conmectioe”+counter+ "from:”+ connection.getInetAddress().getHostNane0 ) 1 private void getStreams()throws IOException I ∥设置输出流 outputs new ObjectoutputStream( connection.getoutputstrean : outputs.flushO: ∥设置输入瓷
// 关闭连接 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 CbjectInputStrean( connection.getInputStrean() outFrame.append("nGet I./0 streams\n°): /处理客户端连接 private void processConnection()throws I0Exception [ ∥连接成功 S(ring message=“服务器端>》连接成功”: outputS.writeCbject(message ) outputs.flushO: /∥输入框 inputBox setEnabled(true ) ∥处理米自客户端的信息 的( ∥读数消息 try( message String inputs.readobject(: o陶tFrane.append("n”+essage): outFrame.setCaretPosition( outFrane.getText ()length() 1 catch ClassNotFoundException classNotFoundException ) outFrame.append("\nlnknown object type received"): 】hile(!nessage..equals(“客户端>》TERMINATE”)): 1 f∥关闭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 closeConsection()throws IOException { outFrane.append("\nUlser terminated connection"); inputBox.setEnabled(false ) o陶tput5.close0: inputS.close(: connection.close(): 1 ∥向客户端发送消息 private void sendMsg(String message { try( O阳tputS.writec6ject(“服务器端>》”+essage): outputs.flushO: 0 tFrane.ppend(“n服务器端>》”+ssage): / catch I0Exception ioException ) outFrame.append("\nError writing object"): 人 f∥min0方法 public static void main(String args[] I ChatServer process new ChatServer () process.setDefaultCloseOperation( JFra.试1T0NL0SE): process.connectServer(): 】/∥end class Chat5 erver
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