Udp数据接收和发送代码

每一台电脑都有自己的ip地址,向指定的ip地址发数据,数据就发送到了指定的电脑。UDP通信只是一种通信方式而已,有了ip地址数据就能发送到指定的电脑了,但是呢!我把数据发送到电脑了,电脑中的哪个程序接收呢。不知道亲们知不知道,其实每一个网络软件都有自己的通信端口,向指定的ip地址和指定的端口发数据,才能发送到指定的程序上(当然是我们自己做的程序)。

我们要做两个程序发送端和接收端,先做发送端吧

java提供了专门用于UDP通信的类DatagramSocket;该类有DatagramSocket(int port)的构造方法---可以设定该程序通信的的端口(就像上面说的有ip了还需要端口,这是设定该程序的通信端口);该类提供了发送数据包的方法send(DatagramPacket p),接收数据包的方法receive(DatagramPacket p)

 那么DatagramSocket sendDatagramSocket = new DatagramSocket(10000);

 sendDatagramSocket .send(DatagramPacket p);这两句就完成了,第一句设定了发送端的通信端口,第二句,发送数据

就缺一点发送到哪里!!往下看

为什么叫数据包呢!上面不是说了,要想通信成功必须向指定的ip地址和指定的端口发数据,发送的时候数据被打包了,里面包含了要发送到的ip地址,端口,和想发的数据(被打包了),注意send(DatagramPacket p)里面的DatagramPacket p,你查一下java的中文api帮助文档就会知道DatagramPacket是一个类,他有一个构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 文档中的解释----构造数据报包,用来将长度为 length 的包发送到指定主机(指定ip地址)上的指定端口号;第一个参数byte[] buf发送的数据,类型为byte[],第二个参数int length,发送数据的长度,第三个InetAddress address发送的ip地址,类型为InetAddress ,第四个端口号。

好那么我先写一个数据String string = "你好";然后转化一下byte[] by = string.getBytes();意思是转化成字符数组

相当于byte[] by ={'y','a','n','g','f','e','n','g','w','u'};不要嫌麻烦,这样写好处大大的有,如果做界面开发,文本框中我们所传的数据都是字符串类型的!!

好接着DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.1.143"),9999);

好说一下这个InetAddress.getByName("192.168.1.143")。InetAddress是一个java中的类,他就是专门操作ip的,列如

InetAddress i = InetAddress.getLocalHost();

System.out.println(i.toString());这两句就可以打印出本机的名称和ip地址

我们用getByName(String host)该方法的作用----在给定主机名的情况下确定主机的 IP 地址。

主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。 

InetAddress ip = InetAddress.getByName("192.168.32.1");

DatagramPacket sendPscket = new DatagramPacket(by, by.length, ip ,8080);
sendDatagramSocket .send(DatagramPacket p);     发送  sendDatagramSocket .send(sendPscket );

以下是发送端代码


package com.xxk.user.server.modular.thread;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Server_test {
    public static void main(String[] str)
    {
        try
        {
          //创建DatagramSocket 对象,并指定该程序的通信端口为9999
          DatagramSocket sendDatagramSocket = new DatagramSocket(9999);
          //确定要发送的消息
          String string = "你好";
          //转成字符数组类型
          byte[] by = string.getBytes();
          //确定要发送的地址
          //如果是自己电脑测试可以这样得到本机地址,也可以自己查自己的ip地址
          //InetAddress ip = InetAddress.getLocalHost();
          //InetAddress ip = InetAddress.getByName("192.168.1.143");
          //确定要发送的端口
          int port = 9999;
          //创建发送类型的数据包,这个数据包包含了要发往的ip地址和端口
          DatagramPacket sendPscket = new  
          DatagramPacket(by,by.length,InetAddress.getByName("192.168.1.143"),port);
          //通过DatagramSocket 的send方法发送数据
          sendDatagramSocket.send(sendPscket);
          System.out.println("发送成功。。。。");
          //创建接收缓冲区
          byte[] bt = new byte[1024];
          //创建接收类型的数据包
          //DatagramPacket(byte[] buf, int length)构造 DatagramPacket,用来接收长度为 
          length 的数据包
          DatagramPacket receivePacket = new DatagramPacket(bt, bt.length);
          //通过DatagramSocket 的receive方法发送数据
          sendDatagramSocket.receive(receivePacket);
          //打印-数据包
          String daString = new 
          String(receivePacket.getData(),0,receivePacket.getLength());
          //getData()方法是返回数据缓冲区
          System.out.println(daString);
          //关闭接收
          sendDatagramSocket.close();
          }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

以下是接收端代码

package com.xxk.user.server.modular.thread;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Client_test {
    public static void main(String[] str)
    {
        try
        {
            //确定端口
            int port = 9999;
            //创建DatagramSocket 对象,并指定该程序的通信端口为8080
            DatagramSocket receiveSocket = new DatagramSocket(port);
            while(true)
            {
                //创建接收缓冲区
                byte[] by = new byte[1024];
                //创建接收数据包
                DatagramPacket receivePacket = new DatagramPacket(by, by.length);
                //接收数据
                System.out.println("正在监听===");
                receiveSocket.receive(receivePacket);
                System.out.println("接收到消息------");
                //解析消息并打印数据
                String string =new 
                String(receivePacket.getData(),0,receivePacket.getLength());
                System.out.println(string);
                //通过数据包也可以解析ip、和端口,打印
//                InetAddress ipAddress = receivePacket.getAddress();
//                int receivePort = receivePacket.getPort();
//                System.out.println(ipAddress);
//                System.out.println(receivePort);
//                //发送数据
//                String aaString = "123";
//                byte[] bb = aaString.getBytes();
//                //创建发送类型的数据包
//                DatagramPacket sendPscket = new DatagramPacket(bb, bb.length, 
                  InetAddress.getByName("192.168.1.143"), 9999);
//                receiveSocket.send(sendPscket);
            }

            //receiveSocket.close();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

然后先启动接收端代码,在启动发送端代码,发送端控制台显示如图

接收端控制台如图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值