`

Java UDP数据报和Socket

    博客分类:
  • Java
阅读更多
两个核心类DatagramPacket 数据包、DatagramSocket 数据包Socket
接收数据包的构造函数
public DatagramPacket(byte buf[], int length)
发送数据包的构造函数,比接收的多了发送目标地址
public DatagramPacket(byte buf[], int length, InetAddress address, int port)

两个核心方法 DatagramSocket类
public void send(DatagramPacket p) throws IOException
public synchronized void receive(DatagramPacket p) throws IOException
都是void的,发送和接受到的数据被包装到DatagramPacket中。


一些有用的应用程序

//简单UDP客户端,发送空数据到服务器,打印接收信息
public class SimpleUDPClient {

  private int bufferSize;
  private DatagramSocket socket;
  private DatagramPacket out;

  public SimpleUDPClient(InetAddress host, int port, int bufferSize, 
      int timeout) throws SocketException {
    out = new DatagramPacket(new byte[1], 1, host, port);
    this.bufferSize = bufferSize;
    socket = new DatagramSocket(0);
    socket.connect(host, port);
    socket.setSoTimeout(timeout);
  }

  public SimpleUDPClient(InetAddress host, int port) throws SocketException {
    this(host, port, 8192, 300000);
  }

  public byte[] request() {
    DatagramPacket in;
    try {
      socket.send(out);
      in = new DatagramPacket(new byte[bufferSize], bufferSize);
      socket.receive(in);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    return in.getData();
  }

  public static void main(String[] args) {
    InetAddress host = null;
    int port = 0;
    try {
      port = Integer.parseInt(args[0]);
      host = InetAddress.getByName(args[1]);
      port = Integer.parseInt("13");
      if (port < 1 || port > 65535)
        throw new Exception("端口号不对");
    } catch (Exception e) {
      try {
        host = InetAddress.getByName("localhost");
        port = 13;
      } catch (UnknownHostException e1) {
      }
    }
    try {
      SimpleUDPClient client = new SimpleUDPClient(host, port);
      byte[] response = client.request();
      String result;
      try {
        result = new String(response, "ASCII");
      } catch (UnsupportedEncodingException e) {
        result = new String(response, "8859_1");
      }
      System.out.println(result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}


//可重用的UDPServer,继承类根据接收信息发送返回结果,
//要实现public abstract void response(DatagramPacket request)方法
public abstract class BaseUDPServer extends Thread {

  private int bufferSize;
  protected DatagramSocket socket;

  public BaseUDPServer(int bufferSize, int port) throws SocketException {
    this.bufferSize = bufferSize;
    socket = new DatagramSocket(port);
  }

  public BaseUDPServer(int port) throws SocketException {
    this(8192, port);
  }

  public void run() {
    byte[] buf = new byte[bufferSize];
    while (true) {
      DatagramPacket in = new DatagramPacket(buf, bufferSize);
      try {
        socket.receive(in);
        this.response(in);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  }

  public abstract void response(DatagramPacket request);
}

//继承BaseUDPServer的,实现了daytime协议的server
public class DayTimeServer extends BaseUDPServer {

  private static final int DEFAULT_PORT = 13;

  public DayTimeServer() throws SocketException {
    super(DEFAULT_PORT);
  }

  public void response(DatagramPacket request) {
    try {
      String date = new Date() + "\r\n";
      byte[] data = date.getBytes("ASCII");
      DatagramPacket response = new DatagramPacket(data, data.length, 
          request.getAddress(), request.getPort());
      socket.send(response);
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args) {
    try {
      BaseUDPServer server = new DayTimeServer();
      server.start();
    } catch (SocketException e) {
      throw new RuntimeException(e);
    }
  }
}


echo协议
基于TCP的echo客户端,可以发送一个消息,然后在同一个连接上等待响应。但是基于UDP的echo客户端不能保证发送的消息总能被收到。因此要异步地发送和接受数据。
public class UDPEchoServer extends UDPServer {

  public final static int DEFAULT_PORT = 7;

  public UDPEchoServer() throws SocketException {
    super(DEFAULT_PORT);
  }

  public void respond(DatagramPacket packet) {
    try {
      DatagramPacket outgoing = new DatagramPacket(packet.getData(), packet.getLength(), 
          packet.getAddress(), packet.getPort());
      socket.send(outgoing);
    } catch (IOException ex) {
      System.err.println(ex);
    }
  }

  public static void main(String[] args) {
    try {
      UDPServer server = new UDPEchoServer();
      server.start();
    } catch (SocketException ex) {
      System.err.println(ex);
    }
  }
}

public class UDPEchoClient {

  private static final int DEFAULT_PORT = 7;

  public static void main(String[] args) {
    String hostname = "localhost";
    int port = DEFAULT_PORT;
    if (args.length > 0) {
      hostname = args[0];
    }
    try {
      DatagramSocket socket = new DatagramSocket();
      InetAddress address = InetAddress.getByName(hostname);
      socket.connect(address, port);
      SenderThread sender = new SenderThread(socket, address, DEFAULT_PORT);
      sender.start();
      Thread receiver = new ReceiverThread(socket);
      receiver.start();
    } catch (SocketException e) {
      throw new RuntimeException(e);
    } catch (UnknownHostException e) {
      throw new RuntimeException(e);
    }
  }
}

public class SenderThread extends Thread {

  private DatagramSocket socket;
  private InetAddress address;
  private int port;
  private boolean stopped = false;

  public SenderThread(DatagramSocket socket, InetAddress address, int port) {
    this.socket = socket;
    this.address = address;
    this.port = port;
  }

  public void halt() {
    this.stopped = true;
  }

  public void run() {
    Scanner sc = new Scanner(System.in);
    while (true) {
      if (stopped) return;
      String input = sc.nextLine();
      if (input.equals("."))
        break;
      byte[] in = input.getBytes();
      DatagramPacket request = new DatagramPacket(in, in.length, address, port);
      try {
        socket.send(request);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
      Thread.yield();
    }
  }
}

public class ReceiverThread extends Thread {

  private DatagramSocket socket;
  private boolean stopped = false;

  public void halt() {
    this.stopped = true;
  }

  public ReceiverThread(DatagramSocket socket) {
    this.socket = socket;
  }

  public void run() {
    byte[] buffer = new byte[65507];
    while (true) {
      if (stopped) return;
      DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
      try {
        socket.receive(dp);
        String s = new String(dp.getData(), 0, dp.getLength());
        System.out.println(s);
        Thread.yield();
      } catch (IOException ex) {
        System.err.println(ex);
      }
    }
  }
}

public abstract class UDPServer extends Thread {

  private int bufferSize; // in bytes
  protected DatagramSocket socket;

  public UDPServer(int port, int bufferSize) throws SocketException {
    this.bufferSize = bufferSize;
    this.socket = new DatagramSocket(port);
  }

  public UDPServer(int port) throws SocketException {
    this(port, 8192);
  }

  public void run() {
    byte[] buffer = new byte[bufferSize];
    while (true) {
      DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
      try {
        socket.receive(incoming);
        this.respond(incoming);
      } catch (IOException ex) {
        System.err.println(ex);
      }
    } // end while
  } // end run

  public abstract void respond(DatagramPacket request);
}
分享到:
评论
2 楼 ace 2010-12-14  
cuiran 写道
请教一下,您的UDPServer类是从哪来的?

你好,已经更新了
1 楼 cuiran 2010-12-08  
请教一下,您的UDPServer类是从哪来的?

相关推荐

    java Udp 收发结构体实例 Socket编程

    Java UDP(用户数据报协议)收发结构体实例与Socket编程是网络通信中的重要主题,尤其是在需要高效、无连接的数据传输场景下。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低的延迟和更高的吞吐量,但不保证...

    java udp socket 网络编程

    Java UDP套接字网络编程是Java编程领域中的一个重要部分,主要涉及如何利用Java的Socket类库来实现基于用户数据报协议(User Datagram Protocol)的通信。UDP是一种无连接的、不可靠的传输协议,适用于对实时性要求...

    java-udp.rar_UDP Java_UDP java socket_java socket _java socket

    在Java中,`DatagramSocket`类代表一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类则用来封装要发送的数据和接收的数据报信息,包括数据、目标IP地址和端口号。 在`UDPServer.java`中,通常会创建一个`...

    Java UDP 网络聊天 基于Socket

    Java UDP(用户数据报协议)网络聊天程序是基于Socket编程实现的一种通信方式。UDP是一种无连接的、不可靠的传输层协议,相比TCP(传输控制协议),它在速度上更占优势,但不保证数据的顺序和完整性。下面将详细阐述...

    java udp视频传输

    `DatagramSocket`用于创建发送和接收UDP数据报的套接字,而`DatagramPacket`则用来封装要发送的数据以及接收的数据包。 2. **数据包封装与解封装**:在发送端,你需要将视频数据封装到`DatagramPacket`对象中,指定...

    java使用udp协议和硬件进行数据收发处理

    上述代码展示了基本的UDP数据收发流程,但实际应用中可能需要考虑更多的因素,如多线程处理接收,错误处理,数据的分包与重组等。为了提高程序的可读性和复用性,通常会将发送和接收功能封装到单独的类或方法中,并...

    udp.rar_java socket udp_socket udp

    标签"java_socket_udp"和"socket_udp"进一步强调了这是关于Java实现的UDP套接字编程。在实际开发中,开发者可能会遇到如多线程、并发处理、错误处理、网络安全性以及性能优化等挑战。例如,为了提高服务的健壮性,...

    JAVA TCP和UDP Socket通信框架

    Java中的TCP和UDP Socket通信是网络编程的基础,用于在不同设备之间建立可靠的数据传输通道。TCP(Transmission Control Protocol)提供的是面向连接、有序且无损的服务,而UDP(User Datagram Protocol)则是无连接...

    Socket_TCP_UDP.rar_java socket tcp udp_java socket 协议_java tcp u

    Socket编程是Java中用于网络通信的核心技术,它涵盖了TCP(传输控制协议)和UDP(用户数据报协议)两种主要的互联网协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是一种无连接的、不可靠...

    java接听UDP广播

    Java UDP(用户数据报协议)是网络编程中的一个重要部分,尤其在需要低延迟、无连接通信的场景下。本文将详细讲解如何使用Java来实现一个UDP广播监听器,以接收并处理UDP广播数据。 首先,我们需要理解UDP的基本...

    JAVA_ Socket_UDP(客户端服务器)

    在Java编程语言中,Socket和UDP(User Datagram Protocol)是两个关键的概念,它们在构建网络通信应用程序时起着重要作用。本篇文章将详细讲解如何使用Java实现UDP协议的Socket客户端和服务器程序。 首先,UDP是一...

    JAVA UDPSocket代码

    创建一个UDP Socket实例并不与远程主机建立连接,而是通过发送和接收`java.net.DatagramPacket`对象来完成通信。 2. **DatagramPacket**: `DatagramPacket`用于封装数据和目标/源IP地址及端口号信息。数据可以是...

    java网络编程,UDP,发送16进制报文。

    在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类用于封装我们要发送的数据和目标地址。以下是一个简单的UDP客户端示例: ```java import java.io....

    基于java的UDP数据传输

    在Java中,处理UDP数据传输主要涉及到两个核心类:`java.net.DatagramSocket` 和 `java.net.DatagramPacket`。 1. **DatagramSocket类**: `DatagramSocket` 类用于创建UDP套接字,它可以用来发送和接收数据报。...

    Java Socket编程实现UDP网络测试

    Java Socket编程实现UDP网络测试是计算机网络领域中的一个重要实践,主要涉及到Java编程语言以及网络通信协议UDP(User Datagram Protocol)。Socket在计算机网络中扮演着桥梁的角色,它允许应用程序通过网络发送和...

    tcp_udp_socket.zip_Java TCP/UDP_java Tcp _java socket _java tcp

    本实验项目“tcp_udp_socket.zip”旨在帮助开发者理解如何使用Java实现TCP和UDP的Socket通信。以下将详细讲解这两个协议及其在Java中的实现。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的...

    JAVA Udp调试工具 Java版本

    Java UDP调试工具是一种用于测试和调试UDP(User Datagram Protocol)网络通信的应用程序。UDP是一种无连接的传输协议,常用于需要高效传输且对数据完整性要求不高的场景,如在线视频流、实时游戏等。该工具通常包含...

    c与Java的UDP收发

    标题“c与Java的UDP收发”指的是使用C语言和Java语言进行用户数据报协议(User Datagram Protocol, UDP)的通信。UDP是一种无连接的、不可靠的传输层协议,常用于实时应用,如音频、视频流传输,因为它提供快速的...

    java_UDPSocket_codes.rar_ServerThread_java udp程序

    Java UDP套接字(UDP Sockets)是一种网络通信机制,用于在互联网上发送和接收数据报,这是一种无连接、不可靠的数据传输方式。在Java中,我们使用`java.net.DatagramSocket`类来实现UDP通信。这个压缩包包含的是...

    UDP聊天&文件发送.rar_JAVA socket编程_java_java udp_java udp通信_套接字通信

    - Java中的`java.net.DatagramSocket`类代表UDP套接字,用于发送和接收数据报包(`java.net.DatagramPacket`)。 - `DatagramSocket`创建后,可以通过`send(DatagramPacket)`发送数据,通过`receive...

Global site tag (gtag.js) - Google Analytics