以流套接字连接形式实现的客户/服务器交互

来源:互联网 发布:泛雅网络课程 编辑:程序博客网 时间:2024/06/08 04:09

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

//服务器类
public class Server extends JFrame {
 private static final long serialVersionUID = 1L;

 private JTextField enterField;//输入对话框
 private JTextArea displayArea;//显示内容
 private ObjectOutputStream output;//输出流
 private ObjectInputStream input;//输入流
 private ServerSocket server;//服务器对象
 private Socket connection;//连接对象
 private int counter = 1;

 public Server() {
  super("Server");

  Container container = getContentPane();

  enterField = new JTextField();
  enterField.setEditable(false);
  enterField.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    sendData(event.getActionCommand());//发送数据
    enterField.setText("");
   }
  });

  container.add(enterField, BorderLayout.NORTH);

  displayArea = new JTextArea();
  container.add(new JScrollPane(displayArea), BorderLayout.CENTER);

  setSize(300, 150);
  setVisible(true);
 }

 public void runServer() {
  try {
   server = new ServerSocket(12345, 100);// 建立一个服务器对象,端口12345,最多连接数100

   while (true) {
    waitForConnection();// 等待连接
    getStreams();// 接收和发送字节
    processConnection();//处理输入输出,进行通信
   }
  } catch (EOFException eofException) {
   // TODO: handle exception
   System.err.println("Server terminated connection");
  }catch (IOException ioException) {
   // TODO: handle exception
   ioException.printStackTrace();
  }
  finally {
   closeConnection();//关闭连接
   ++counter;
  }
 }

 private void waitForConnection() throws IOException {
  displayMessage("Waiting for connection/n");
  connection = server.accept();// 监听客户的连接
  displayMessage("Connection " + counter + " received from: "
    + connection.getInetAddress().getHostName());//得到客户机的名称
 }
 
 private void getStreams() throws IOException{
  output=new ObjectOutputStream(connection.getOutputStream());//得到输出流
  output.flush();//刷新缓冲区
  
  input=new ObjectInputStream(connection.getInputStream());//得到输入流
  
  displayMessage("/nGot I/O streams/n");
 }
 
 private void processConnection() throws IOException{
  String message="Connection successful";
  sendData(message);
  
  setTextFieldEditable(true);
  
  do {
   try {
    message=(String)input.readObject();//得到输入的信息
    displayMessage("/n"+message);
   } catch (ClassNotFoundException classNotFoundException) {
    // TODO: handle exception
    displayMessage("/nUnknow object type received");
   }
  } while (!message.equals("CLIENT>>>TERMINATE"));//terminate结束
 }
 
 private void closeConnection() {
  displayMessage("/nTerminating connection/n");
  setTextFieldEditable(false);
  
  try {
   output.close();
   input.close();
   connection.close();
  } catch (IOException ioException) {
   // TODO: handle exception
   ioException.printStackTrace();
  }
 }
 
 private void sendData(String message) {
  try {
   output.writeObject("SERVER>>>"+message);//写入数据
   output.flush();
   displayMessage("/nSERVER>>>"+message);
  } catch (IOException ioException) {
   // TODO: handle exception
   displayArea.append("/nError writing object");
  }
 }
 
 private void displayMessage(final String messageToDisplay) {
  SwingUtilities.invokeLater(new Runnable() {//内部类,使得在线程中能够正确文本显示内容
   public void run() {
    displayArea.append(messageToDisplay);
    displayArea.setCaretPosition(displayArea.getText().length());//将光标定位到最后一个字符后
   }
  });
 }
 
 private void setTextFieldEditable(final boolean editable) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    enterField.setEditable(editable);
   }
  });
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Server application=new Server();
  application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  application.runServer();
 }

}

 

 

 

 

package classWork;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

//客户类
public class Client extends JFrame {
 private static final long serialVersionUID = 1L;

 private JTextField enterField;
 private JTextArea displayArea;
 private ObjectOutputStream output;
 private ObjectInputStream input;
 private Socket client;
 private String chatServer;
 private String message="";
 
 public Client(String host) {
  super("Client");
  
  chatServer=host;//服务器地址
  
  Container container=getContentPane();
  
  enterField=new JTextField();
  enterField.setEditable(false);
  enterField.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    sendData(event.getActionCommand());
    enterField.setText("");
   }
  });
  
  container.add(enterField,BorderLayout.NORTH);
  
  displayArea=new JTextArea();
  container.add(new JScrollPane(displayArea),BorderLayout.CENTER);
  
  setSize(300, 150);
  setVisible(true);
 }
 
 private void runClient() {
  try {
   connectToServer();//创建套接字,准备连接
   getStreams();
   processConnection();
  } catch (EOFException eofException) {
   // TODO: handle exception
   System.err.println("Client terminated connection");
  }catch (IOException ioException) {
   // TODO: handle exception
   ioException.printStackTrace();
  }
  
  finally {
   closeConnection();
  }
 }
 
 private void connectToServer() throws IOException{
  displayMessage("Attempting connection/n");
  
  client=new Socket(InetAddress.getByName(chatServer),12345);//连接服务器
  
  displayMessage("Connected to: "+client.getInetAddress().getHostName());
 }
 
 private void getStreams() throws IOException{
  output=new ObjectOutputStream(client.getOutputStream());
  output.flush();
  
  input=new ObjectInputStream(client.getInputStream());
  
  displayMessage("/nGot I/O streams/n");
 }
 
 private void processConnection() throws IOException{
  setTextFieldEditable(true);
  
  do {
   try {
    message=(String)input.readObject();
    displayMessage("/n"+message);
   } catch (ClassNotFoundException classNotFoundException) {
    // TODO: handle exception
    displayMessage("/nUnknow object type received");
   }
  } while (!message.equals("SERVER>>>TERMINATE"));
 }
 
 private void closeConnection() {
  displayMessage("/nClosing connection");
  setTextFieldEditable(false);
  
  try {
   output.close();
   input.close();
   client.close();
  } catch (IOException ioException) {
   // TODO: handle exception
   ioException.printStackTrace();
  }
 }
 
 private void sendData(String message) {
  try {
   output.writeObject("CLIENT>>> "+message);
   output.flush();
   displayMessage("/nCLIENT>>> "+message);
  } catch (IOException ioException) {
   // TODO: handle exception
   displayArea.append("/nError writing object");
  }
 }
 
 private void displayMessage(final String messageToDisplay) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    displayArea.append(messageToDisplay);
    displayArea.setCaretPosition(displayArea.getText().length());
   }
  });
 }
 
 private void setTextFieldEditable(final boolean editable) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    enterField.setEditable(editable);
   }
  });
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Client application;
  
  if(args.length==0)//如没有指定服务器IP,则与本地计算机进行通信,localhost,以进行测试
   application=new Client("127.0.0.1");
  else
   application=new Client(args[0]);
  
  application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  application.runClient();
 }

}

原创粉丝点击