java实现UDP通信

1.概述

用DatagramSocket与DatagramPacket实现UDP通信.UDP比TCP相对来说简单一点,不需要等待连接,且处理数据不需要用输出输出流,只需要DatagramPacket.严格来说,UDP没有服务端和客户端之分,只有发送端与接收端之分.

2.发送端

发送端首先建立DatagramSocket与DatagramPacket,设置好DatagramPacket的端口与ip,再通过DatagramSocket发送.

(1)创建DatagramSocket与DatagramPacket

DatagramSocket socket = new DatagramSocket(55555);

这里的55555端口是指数据通过这个端口发送.

(2)创建DatagramPacket

InetAddress ip = InetAddress.getByName("127.0.0.1");
int port = 12345;
String message = "message";
DatagramPacket packet = new DatagramPacket(message.getBytes(),message.getBytes().length,ip,port);

构造方法DatagramPacket()的四个参数分别为

  • 发送的字节数组
  • 字节数组长度
  • ip
  • 端口

这里端口不能与上面的一致,不然的话会提示端口被占用.

(3)发送

socket.send(packet);

3.接收端

接收端只需指定端口进行接收,这里的端口在DatagramSocket中的构造方法中指定,与发送端的发送的packet中设置的端口一致.

(1)创建DatagramSocket

DatagramSocket socket = new DatagramSocket(12345);

(2)创建DatagramPacket

这里创建的DatagramPacket只需要指定存储数据的字节数组与该字节数组的长度.

byte [] message = new byte[2048];
DatagramPacket packet = new DatagramPacket(message, message.length);

(3)接收

socket.receive(packet);

这个方法会阻塞,直到接收到packet.

(4)获取数据

接收到packet后可以使用getData()获取数据,返回字节数组,可以传递给String的构造方法创建String.

String str = new String(packet.getData());

4.完整代码

这里人为地设定了客户端与服务端,可以互相发送数据,服务端输入后发送到服务端,服务端返回固定数据,
"客户端"与"服务端"轮流扮演了发送端与接收端的角色.配合了swing使用.

(1)Server.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;

public class Server
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Server");
        JTextArea text = new JTextArea();

        frame.add(text);
        frame.setSize(600, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        try
        {
            byte [] message = new byte[2048];
            DatagramSocket socket = new DatagramSocket(12345);
            DatagramPacket packet = new DatagramPacket(message, message.length);
            socket.receive(packet);

            InetAddress ip = packet.getAddress();
            int port = packet.getPort();
            text.setText("ip : "+ip.toString()+"\n");
            text.append("port : "+port+"\n");
            text.append("message : "+new String(packet.getData()));

            String messageFromServer = "Message from server";
            packet = new DatagramPacket(messageFromServer.getBytes(),messageFromServer.getBytes().length,ip,port);
            socket.send(packet);
            socket.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

(2)Client.java

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.*;
import java.awt.GridLayout;
public class Client
{
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JTextArea text = new JTextArea();
        JButton send = new JButton("send");
        GridLayout layout = new GridLayout(2,1,1,1);

        frame.setLayout(layout);
        frame.setTitle("Client");
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setSize(600, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(text);
        frame.add(send);
        send.addActionListener( v->
        {
            try
            {
                InetAddress ip = InetAddress.getByName("127.0.0.1");
                int port = 12345;
                DatagramSocket socket = new DatagramSocket(55555);
                String message = text.getText();
                DatagramPacket packet = new DatagramPacket(message.getBytes(),message.getBytes().length,ip,port);
                socket.send(packet);

                byte [] messageFromServer = new byte[2048];
                packet = new DatagramPacket(messageFromServer, messageFromServer.length);
                socket.receive(packet);
                text.setText(new String(packet.getData()));
                socket.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        });
    }
}

5.测试

原文地址:https://blog.51cto.com/13996197/2456175

时间: 2024-11-03 06:15:48

java实现UDP通信的相关文章

java基础 UDP通信

无连接通信 UDP 客户端 package com.swift.test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; /*使用UDP通信编写一个Java程序.要求:获取键盘输入的内容.发送到服务端.服务端接收后.在控制台上打印接收到的内容 客戶端

Java 简单UDP通信

Java手册 java.net Class DatagramSocket java.lang.Object java.net.DatagramSocket All Implemented Interfaces: Closeable, AutoCloseable 已知直接子类: MulticastSocket public class DatagramSocket extends Object implements Closeable 这个类代表数据包发送和接收数据报套接字. 数据报套接字发送或接

JAVA网络编程--UDP通信

首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑port 3.  定义通信规则.这个通信规则称为协议. 国际组织定义了通用协议TCP/IP. 127.0.0.1本机回环地址 不易记忆,可用主机名 主机名:localhost 0-65535port范围 0-1024系统使用或保留port .当中mysql的port号为 3306 一.UDP UDP相对于

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

java服务器与linux c客户端之间udp通信

java服务器和 linux c客户端采用udp协议互相通信,最关键的点是数据结构的统一.比如说,在c中一个char型 是8bit,在java中,char 是16bit,所以c和java的char类型不能直接互相转换.在本例程中,c的char 类型和 java的byte类型,两个数据类型都是8bit,这样就保证了数据正确传输的基本条件之一. java服务器代码如下: import java.io.*; import java.lang.*; import java.net.*; public c

[Java] Tcp/udp 简单通信

本文转自  我自己的博客guozeyiblog.cn 欢迎来访 效果图: //UDP通信 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.*; import javax.swing.*; class send extends JFrame implements ActionL

java使用UDP

Java中通信可以使用的协议包括TCP协议和UDP协议 UDP协议概念 UDP协议的全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,但它是一种无连接的协议.在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的. 综上所述:UDP不提供可靠地保证,保证数据准确按序到达目的地 为什么要使用UDP 在选择使用协议的时候,选择UDP必须要谨慎?在网络质量令人不十分满

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

Android 之简单UDP通信

一 Android UDP通信编程步骤 服务器端: 1.建立Socket 2.监听端口  3.接收数据  4.实现数据发送 客户端:直接实现数据发送即可 二 代码,实现一个简单的UdpHelper类 1 package com.br.delphi.centercontrol; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import android.util.Log; 6 7 import java.io.IOExc