用兩個類來實現,一個Server類和Client類,在MyEclipse下調試通過。
Server類:
/**
?* 聊天軟件Server程序段
?* @author Rabbit
?* @version 0.9 2007-11-6
?*/
package com.sinojava.three;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Server {
?private JFrame frame;
?private JTextField enter;
?private JTextArea display;
?private ObjectOutputStream output;
?private ObjectInputStream input;
?private ServerSocket ser;
?private Socket soc;
?private Container container;
?private int counter = 0;
?//服務器端GUI
?public Server() {
??frame = new JFrame("服務器端");
??container = frame.getContentPane();
??enter = new JTextField();
??enter.setEnabled(false);
??enter.addActionListener(new ActionListener() {
???public void actionPerformed(ActionEvent e) {
????sendData(e.getActionCommand());
???}
??});
??container.add(enter,BorderLayout.NORTH);
??display = new JTextArea();
??container.add(new JScrollPane(display),BorderLayout.CENTER);
??frame.setSize(400,400);
??frame.setVisible(true);
??frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?}
?private void sendData(String message) {
?????? // 向客戶端發送信息
?????? try {
????????? output.writeObject("服務器>>>"+message);
????????? output.flush();
????????? display.append("\n服務器>>>"+message);
?????? }
?????? catch (IOException e) {
????????? display.append("\n錯誤寫入對象");
?????? }
??? }
? public void runServer() {???
?????? try {
????????? // 第一步:創建一個ServerSocket
????????? ser = new ServerSocket(5000,100);
????????? while(true) {
???????? ? counter++;
???????????? // 第二步:等待一個連接
???????????? waitForConnection();
???????????? // 第三步:獲取接受數據
???????????? getStreams();
???????????? // 第四步:連接處理
???????????? processConnection();
???????????? // 第五步:關閉連接
???????????? closeConnection();
????????? }
?????? }catch (IOException e) {
????????? e.printStackTrace();
?????? }
??? }
? //等待連接服務器
? private void waitForConnection() throws IOException {
?? display.setText("等待連接\n");
????? soc = ser.accept();???
????? //InetAddress類采用工廠設計模式,有三個靜態工廠方法,如getHostName or getLocalHost。
????? display.append("Socket "+counter+" 接收來至:"+soc.getInetAddress().getHostName());
? }
??? // 獲取接受數據
? private void getStreams() throws IOException {
????? output = new ObjectOutputStream(soc.getOutputStream());
????? output.flush();
????? input = new ObjectInputStream(soc.getInputStream());
????? display.append("\n獲得I/O流\n");
? }
??? // 連接處理
? private void processConnection() throws IOException {
????? String message ="服務器: 連接成功\n";
????? output.writeObject(message);
????? output.flush();
????? enter.setEnabled(true);
????? do {
????????? try {
???????????? message = (String)input.readObject();
???????????? enter.setText(null);
???????????? display.append("\n"+message);
???????????? display.setCaretPosition(display.getText().length());
????????? }
????????? catch(ClassNotFoundException e) {
???????????? display.append("\n未知對象類型接收");
????????? }
?????? } while (!message.equals("客戶端>>>終端"));
??? }
? //關閉Socket
? private void closeConnection() throws IOException {
????? display.append("\n用戶終端連接");
????? enter.setEnabled(false);
????? output.close();
????? input.close();
????? soc.close();
? }
? public static void main(String args[]) {
?? Server server = new Server();
?? server.runServer();
? }
}
Client類:
/**
?* 聊天軟件Client程序段
?* @author Rabbit
?* @version 0.9 2007-11-6
?*/
package com.sinojava.three;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Client {
?? private JFrame frame;
?? private JTextField enter;
?? private JTextArea display;
?? private ObjectOutputStream output;
?? private ObjectInputStream input;
?? private String message = "";
?? private String chatServer;
?? private Socket soc;
?? private Container container;
?? // 客戶端GUI
?? public Client(String host) {
????? frame = new JFrame("客戶端");
????? // 設置服務器到客戶端連接
????? chatServer = host;
????? container = frame.getContentPane();
????? enter = new JTextField();
????? enter.setEnabled(false);
????? enter.addActionListener(new ActionListener() {
??????????? public void actionPerformed(ActionEvent e) {
?????????????? sendData(e.getActionCommand());???????????
??????????? }
???????? });
????? container.add(enter,BorderLayout.NORTH);
????? display = new JTextArea();
????? container.add(new JScrollPane(display),BorderLayout.CENTER);
????? frame.setSize(400,400);
????? frame.setVisible(true);
????? frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
?? }
?? // 連接服務器處理信息
?? public void runClient() {
????? try {
???????? // 第一步:創建一個Socket,連接服務器
???????? connectToServer();
???????? // 第二步:獲取接受數據
???????? getStreams();
???????? // 第三步:連接處理
???????? processConnection();
???????? // 第四步:關閉連接
???????? closeConnection();
????? }
????? catch (IOException e) {
???????? e.printStackTrace();
????? }
?? }
?? // 獲取接受數據
?? private void getStreams() throws IOException {
????? output = new ObjectOutputStream(soc.getOutputStream());
????? output.flush();?????
????? input = new ObjectInputStream(soc.getInputStream());
????? display.append("\n獲得I/O流\n");
?? }
?? // 創建一個Socket,連接服務器
?? private void connectToServer() throws IOException {?????
????? display.setText("連接中\n");
????? //InetAddress類采用工廠設計模式,有三個靜態工廠方法,如getByName。
????? soc = new Socket(InetAddress.getByName(chatServer),5000);
????? display.append("連接到:"+soc.getInetAddress().getHostName());
?? }
?? // 連接處理
?? private void processConnection() throws IOException {
????? enter.setEnabled(true);
????? do {
???????? try {
??????????? message = (String)input.readObject();
??????????? enter.setText("");
??????????? display.append("\n"+message);
??????????? display.setCaretPosition(display.getText().length());
???????? }
???????? catch (ClassNotFoundException e) {
??????????? display.append("\n沒有對象接受");
???????? }
????? } while (!message.equals("服務器>>>終端"));
?? }?
?? // 關閉連接
?? private void closeConnection() throws IOException {
????? display.append("\n關閉連接");
????? output.close();
????? input.close();
????? soc.close();
?? }
?? // 發送信息到服務器
?? private void sendData(String message) {
????? try {
???????? output.writeObject("客戶端>>>"+message);
???????? output.flush();
???????? display.append("\n客戶端>>>"+message);
????? }
????? catch (IOException e) {
???????? display.append("\n錯誤的對象");
????? }
?? }
?? public static void main(String args[]) {
????? Client client = new Client("127.0.0.1");
????? client.runClient();
?? }
}?
?
?