//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)
沒有留言:
張貼留言