现在的位置: 首页 > 综合 > 正文

数据报形式的无连接客户/服务器交互

2013年08月30日 ⁄ 综合 ⁄ 共 5026字 ⁄ 字号 评论关闭

package dataGram;

import java.awt.BorderLayout;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

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

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

 private JTextArea displayArea;
 private DatagramSocket socket;//用于发送分组

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

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

  setSize(400, 300);
  setVisible(true);

  try {
   socket = new DatagramSocket(5000);//指定端口
  } catch (SocketException socketException) {
   // TODO: handle exception
   socketException.printStackTrace();
   System.exit(1);
  }
 }

 private void waitForPackets() {
  while (true) {
   try {
    byte data[] = new byte[100];
    DatagramPacket receivePacket = new DatagramPacket(data,
      data.length);//用于存储接收到的信息分组

    socket.receive(receivePacket);//等待分组到达服务器,到达后,将信息存入参数中

    displayMessage("/nPacket received:"
      + "/nFrom host: "
      + receivePacket.getAddress()
      + "/nHost port: "
      + receivePacket.getPort()
      + "/nLength: "
      + receivePacket.getLength()
      + "/nContaining:/n/t"
      + new String(receivePacket.getData(), 0, receivePacket
        .getLength()));

    sendPacketToClient(receivePacket);
   } catch (IOException ioException) {
    // TODO: handle exception
    ioException.printStackTrace();
   }
  }
 }

 private void sendPacketToClient(DatagramPacket receivePacket)
   throws IOException {//将信息返回给客户
  displayMessage("/n/nEcho data to client...");

  DatagramPacket sendPacet = new DatagramPacket(receivePacket.getData(),
    receivePacket.getLength(), receivePacket.getAddress(),
    receivePacket.getPort());
  
  socket.send(sendPacet);//发送分组
  displayMessage("Packet sent/n");
 }

 private void displayMessage(final String messageToDisplay) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    displayArea.append(messageToDisplay);
    displayArea.setCaretPosition(displayArea.getText().length());
   }
  });
 }

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

}

 

 

package dataGram;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

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 DatagramSocket socket;

 public Client() {
  super("Client");

  Container container = getContentPane();

  enterField = new JTextField("Type message here");
  enterField.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent event) {
    try {
     displayArea.append("/nSending packet containing: "
       + event.getActionCommand() + "/n");

     String message = event.getActionCommand();
     byte data[] = message.getBytes();//将用户输入的内容进行分组

     DatagramPacket sendPacket = new DatagramPacket(data,
       data.length, InetAddress.getLocalHost(), 5000);

     socket.send(sendPacket);
     displayArea.append("Packet sent/n");
     displayArea
       .setCaretPosition(displayArea.getText().length());
    } catch (IOException ioException) {
     // TODO: handle exception
     displayMessage(ioException.toString() + "/n");
     ioException.printStackTrace();
    }
   }
  });

  container.add(enterField, BorderLayout.NORTH);

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

  setSize(400, 300);
  setVisible(true);

  try {
   socket = new DatagramSocket();
  } catch (SocketException socketException) {
   // TODO: handle exception
   System.exit(1);
  }
 }

 private void waitForPackets() {
  while (true) {
   try {
    byte data[] = new byte[100];
    DatagramPacket receivePacket = new DatagramPacket(data,
      data.length);

    socket.receive(receivePacket);

    displayMessage("/nPacket received: "
      + "/nFrom host: "
      + receivePacket.getAddress()
      + "/nHost port: "
      + receivePacket.getPort()
      + "/nLength: "
      + receivePacket.getLength()
      + "/nContaiing:/n/t"
      + new String(receivePacket.getData(), 0, receivePacket
        .getLength()));
   } catch (IOException ioException) {
    // TODO: handle exception
    displayMessage(ioException.toString()+"/n");
    ioException.printStackTrace();
   }
  }
 }

 private void displayMessage(final String messageToDisplay) {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    displayArea.append(messageToDisplay);
    displayArea.setCaretPosition(displayArea.getText().length());
   }
  });
 }

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

}

抱歉!评论已关闭.