java实现UDP通信-创新互联-成都快上网建站

java实现UDP通信-创新互联

1.概述

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

成都创新互联专注于企业网络营销推广、网站重做改版、屯留网站定制设计、自适应品牌网站建设、H5响应式网站商城网站制作、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为屯留等各大城市提供网站开发制作服务。

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.测试

java实现UDP通信

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享名称:java实现UDP通信-创新互联
文章路径:http://kswjz.com/article/dosiss.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流