加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java Socket UDP通信实例

(2013-10-27 19:25:35)
标签:

java

分类: 计算机相关

java提供了URL类和URLConnection类来在一个相对比较高的层次上进行网络通信,以实现对Internet网络资源的访问。在各种网络服务器应用程序以及特殊协议应用在客户与服务器之间使用的通信组件内底层的核心通信机制都是使用传输层的接口的Socket机制来通信的。

用户使用Socket套接字一般有两个通信协议可供选择TCP和UDP。

UDP socket 建立应用程序间通信需要:

UDP 需要使用DatagramSocket和DatagramPacket类。

1.调用DatagramSocket类创建一个数据报通信的Socket对象,然后就可以收发数据报。

2.指明了目的地址和端口号的用来发送数据包,没有指明的用来接收数据报。

3.服务器端先建立数据报通信DatagramSocket,构建数据报格式DatagramPacket,接着就是接收数据包和发送数据包。

实例:

服务器端:

package UDPSocket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
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 javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class UDPServer extends JFrame{
 private static final long serialVersionUID=1L;
 private JTextArea enterArea;
 private JTextArea displayArea;
 private JButton sendButton;
 private Box box;
 DatagramSocket socket;
 DatagramPacket inPacket;
 DatagramPacket outPacket;
 InetAddress clientAddress;
 int clientPort;
 byte[] msg=new byte[100];
 String receiveMsg;
 
 public UDPServer() {
  super("UDPServer");
  Container container=getContentPane();
  enterArea =new JTextArea();
  enterArea.setEnabled(false);
  sendButton=new JButton("Send");
  sendButton.setEnabled(false);
  sendButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
   if(enterArea.getText().equals("")){
    JOptionPane.showMessageDialog(UDPServer.this, "Warning! The sending content should not be empty!","Warning",JOptionPane.WARNING_MESSAGE);
    return;
   }
   else {
    sendData(enterArea.getText());
    enterArea.setText("");
   }
   }
  });
  
  displayArea=new JTextArea();
  displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
  displayArea.setFont(new Font("Serif",Font.BOLD,14));
  displayArea.setForeground(Color.BLUE);
  displayArea.setEnabled(true);
  container.add(Box.createRigidArea(new Dimension(0,30)),BorderLayout.NORTH);
  container.add(new JScrollPane(displayArea),BorderLayout.CENTER);
  box=Box.createHorizontalBox();
  box.setBorder(BorderFactory.createTitledBorder("Enter Message!"));
  box.add(new JScrollPane(enterArea));
  box.add(sendButton);
  container.add(box,BorderLayout.SOUTH);
  setSize(500,300);
  setVisible(true);
 }
 public void runServer(){
  try {
   
   while(true){
    socket=new DatagramSocket(5556);
    prepareForConnection();
    processConnection();
    closeConnection();
   }
  
  }catch (IOException e) {
   e.printStackTrace();
   // TODO: handle exception
  }
 }
 private void prepareForConnection() throws IOException {
  displayArea.setText("Waiting for connection...\n");
  inPacket=new DatagramPacket(msg, msg.length);
  socket.receive(inPacket);
  receiveMsg=new String(inPacket.getData(),0,inPacket.getLength());
  displayArea.append(receiveMsg+"\n");
  clientAddress=inPacket.getAddress();
  clientPort=inPacket.getPort();
  sendData("Connected successfully with server");
  enterArea.setEnabled(true);
  sendButton.setEnabled(true);
 }

 private void processConnection() throws IOException{
  do {
   socket.receive(inPacket);
   receiveMsg=new String(inPacket.getData(),0,inPacket.getLength());
   displayArea.append(receiveMsg+"\n");
   displayArea.setCaretPosition(displayArea.getText().length());
  } while (!receiveMsg.equals("CLENT>>>terminate"));
 }
 private void closeConnection() throws IOException{
  displayArea.append("\nUser terminatedd connection.");
  enterArea.setEnabled(false);
  sendButton.setEnabled(false);
  socket.close();
 }
 
 private void sendData(String message){
  try {
   byte[] temp=("SERVER>>>"+message).getBytes();
   outPacket=new DatagramPacket(temp, temp.length,clientAddress,clientPort);
   socket.send(outPacket);
   displayArea.append("SERVER>>>"+message+"\n");
  } catch (IOException e) {
   displayArea.append("\nError when writing object!");
   // TODO: handle exception
  }
 }
  public static void main (String args[]){
   UDPServer server=new UDPServer();
   server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   server.runServer();
  }
 
}


客户端:

package UDPSocket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
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 javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class UDPClient extends JFrame{
 private static final long serialVersionUID=1L;
 private JTextArea enterArea;
 private JTextArea displayArea;
 private JButton sendButton;
 private Box box;
 DatagramPacket inPacket;
 DatagramPacket outPacket;
 DatagramSocket socket;
 InetAddress serverAddress;
 int serverPort;
 byte[] msg=new byte[100];
 String receivedMsg;
 private  String charServer;
 public UDPClient(String host) {
 super("Client");
 charServer =host;
 Container container=getContentPane();
 enterArea=new JTextArea();
 enterArea.setEnabled(false);
 sendButton=new JButton("Send");
 sendButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent event) {
   // TODO Auto-generated method stub
   if(enterArea.getText().equals("")){
    JOptionPane.showMessageDialog(UDPClient.this, "Warning!The sending content should not be empty!","Warning",JOptionPane.WARNING_MESSAGE);
    return;
   } else {
    sendData(enterArea.getText());
    enterArea.setText("");    
   }
  }
 });
 displayArea=new JTextArea();
 displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
 displayArea.setFont(new Font("Serif",Font.BOLD,14));
 displayArea.setForeground(Color.BLUE);
 container.add(Box.createRigidArea(new Dimension(0,30)),BorderLayout.NORTH);
 container.add(new JScrollPane(displayArea),BorderLayout.CENTER);
 box=Box.createHorizontalBox();
 box.setBorder(BorderFactory.createTitledBorder("Enter message"));
 box.add(new JScrollPane(enterArea));
 box.add(sendButton);
 container.add(box,BorderLayout.SOUTH);
 setSize(500,300);
 setVisible(true); 
 }
 
 public void runClient(){
  try {
   prepareConnection();
   processConnection();
   closeConnection();
   
  } catch (Exception e) {
   // TODO: handle exception
  e.printStackTrace();
  }
 }
 private void prepareConnection(){
  displayArea.setText("Attempting a connection...");
  try {
   socket=new DatagramSocket();
   inPacket=new DatagramPacket(msg,msg.length);
   serverAddress=InetAddress.getByName(charServer);
   serverPort=5556;
   sendData("Trying to connect to Server");
  } catch (Exception e) {
   System.out.println(e.toString());
   System.exit(1);
   // TODO: handle exception
  }
 }
 private void processConnection() throws IOException{
  do {
   socket.receive(inPacket);
   enterArea.setEnabled(true);
   sendButton.setEnabled(true);
   receivedMsg=new String(inPacket.getData(),0,inPacket.getLength());
   displayArea.append(receivedMsg+"\n");
   displayArea.setCaretPosition(displayArea.getText().length());
  } while (!receivedMsg.equals("SERVER>>>terminate"));
 }
 private void closeConnection() throws IOException{
  displayArea.append("\nServer terminated connection.");
  enterArea.setEnabled(false);
  sendButton.setEnabled(false);
  socket.close();
 }
 private void sendData(String message){
  try {
   byte[] temp=("CLIENT>>>"+message).getBytes();
   outPacket=new DatagramPacket(temp, temp.length,serverAddress,serverPort);
   socket.send(outPacket);
   displayArea.setText("CLIENT>>>"+message+"\n");
   
  } catch (Exception e) {
   // TODO: handle exception
   displayArea.append("\nError when writing object");
  }
 }
 public static void main(String args[]){
  UDPClient client;
  if(args.length==0){
   client=new UDPClient("127.0.0.1");
  } else{
   client=new UDPClient(args[0]);
  }
  client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  client.runClient();
 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有