//Server.java import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Server extends JFrame { private JTextField enterField; private JTextArea displayArea; private ObjectOutputStream output; private ObjectInputStream input; private ServerSocket server; private Socket connection; private int counter = 1; // set up GUI // 設定 GUI public Server() { super( "Server" ); Container container = getContentPane(); // create enterField and register listener // 建立 enterField 設定 傾聽 enterField = new JTextField(); enterField.setEditable( false ); enterField.addActionListener( new ActionListener() { // send message to client // 傳送 msg 到 client public void actionPerformed( ActionEvent event ) { sendData( event.getActionCommand() );//傳送msg enterField.setText( "" ); } } ); container.add( enterField, BorderLayout.NORTH ); // create displayArea // 建立 displayArea(顯示介面) displayArea = new JTextArea(); container.add(new JScrollPane( displayArea ), BorderLayout.CENTER ); setSize( 300, 150 ); setVisible( true ); } // end Server constructor // set up and run server // 設定 和 執行 server public void runServer() { // set up server to receive connections; process connections // 接收連線 ; 處理連線 try { // Step 1: Create a ServerSocket. // Step 1: 建立 ServerSocket. server = new ServerSocket(12345); while ( true ) { try { // Step 2: Wait for a connection. // Step 2: 等待連線 waitForConnection(); // Step 3: Get input & output streams. // Step 3: 得到 I/O串流 getStreams(); // Step 4: Process connection. // Step 4: 處理連線 processConnection(); } // process EOFException when client closes connection // 當 closes 關閉連線 處理例外 catch ( EOFException eofException ) { System.err.println( "Server 終止連線" ); } finally { // Step 5: Close connection. // Step 5: 關閉連線 closeConnection(); ++counter; } } // end while } // end try // process problems with I/O // 處理 I/O 問題 catch ( IOException ioException ) { ioException.printStackTrace(); } } // end method runServer // Step 2: wait for connection to arrive, then display connection info // Step 2: 等待連線到達 並且 顯示連線訊息 private void waitForConnection() throws IOException { displayMessage( "等待連線...\n" ); // allow server to accept connection // 允許 server 接收連線 connection = server.accept(); displayMessage( "連線 " + counter + " 從 : " + connection.getInetAddress().getHostName() ); } // Step 3: get streams to send and receive data // Step 3: 接收 串流 和 接收 數據 private void getStreams() throws IOException { // set up output stream for objects // 設定 objects 的 output(輸出) stream output = new ObjectOutputStream( connection.getOutputStream() ); // flush output buffer to send header information // 輸出訊息 output.flush(); // set up input stream for objects // 設定 objects 的 input(輸入) stream input = new ObjectInputStream( connection.getInputStream() ); displayMessage( "\n得到 I/O stream\n" ); } // Step 4: process connection with client // Step 4: 處理連線 private void processConnection() throws IOException { // send connection successful message to client // 傳送 連線成功訊息 給 client String message = "連線成功 !"; sendData( message ); // enable enterField so server user can send messages // 設定 enterField,讓 server 可以送 msg enterField.setEditable( true ); // process messages sent from client // 處理從 client 傳送的訊息 do { // read message and display it // 讀取 msg 並且顯示 try { message = ( String ) input.readObject(); displayMessage( "\n" + message ); sendData("訊息送達處理中...");//收到之後輸出.. /* code...答案放置位址 */ } // catch problems reading from client catch ( ClassNotFoundException classNotFoundException ) { displayMessage( "\n未知 的類型" ); } } while ( !message.equals( "CLIENT>>> TERMINATE" ) ); } // end method processConnection // Step 5: close streams and socket // Step 5: 關閉連線 private void closeConnection() { displayMessage( "\n終止連線\n" ); // disable enterField // enterField 功能失效 enterField.setEditable( false ); try { output.close(); input.close(); connection.close(); } catch( IOException ioException ) { ioException.printStackTrace(); } } // send message to client // 傳送 msg 到 client private void sendData( String message ) { // send object to client // 傳送 物件 到 client try { output.writeObject( "SERVER>>> " + message ); output.flush(); displayMessage( "\nSERVER>>> " + message ); } // process problems sending object // 處理錯誤 catch ( IOException ioException ) { displayArea.append( "\n錯誤文字物件" ); } } //印出 msg private void displayMessage( final String messageToDisplay ) { displayArea.append( messageToDisplay ); displayArea.setCaretPosition(displayArea.getText().length() ); } public static void main( String args[] ) { Server application = new Server(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.runServer(); } }
2009年6月23日
網路程式設計 - 期末考偷偷來 ( Network I / O )
相關連結
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/JavaGossip2.htm
http://home.so-net.net.tw/idealist/Java/IO.html
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言