zoukankan      html  css  js  c++  java
  • java 之UDP编程

    大白话:每一台电脑都有自己的ip地址,向指定的ip地址发数据,数据就发送到了指定的电脑。UDP通信只是一种通信方式而已,其特点就不多说。有了ip地址数据就能发送到指定的电脑了,但是呢!我把数据发送到电脑了,电脑中的哪个程序接收呢。不知道亲们知不知道,其实每一个网络软件都有自己的通信端口,像qq,酷狗音乐的下载端口等等。现在知道了吧,向指定的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 = "yangfengwu";然后转化一下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.32.1"),8080);

    好说一下这个InetAddress.getByName("192.168.32.1")。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 server;

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

    public class Server_test {
    public static void main(String[] str)
    {
    try
    {
    //创建DatagramSocket 对象,并指定该程序的通信端口为10000
    DatagramSocket sendDatagramSocket = new DatagramSocket(10000);
    //确定要发送的消息
    String string = "yangfengwu";
    //转成字符数组类型
    byte[] by = string.getBytes();
    //确定要发送的地址
    //InetAddress ip = InetAddress.getLocalHost();//如果是自己电脑测试可以这样得到本机地址,也可以自己查自己的ip地址

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

    //确定要发送的端口
    int port = 8080;
    //创建发送类型的数据包,这个数据包包含了要发往的ip地址和端口
    DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),port);
    //通过DatagramSocket 的send方法发送数据
    sendDatagramSocket.send(sendPscket);
    //创建接收缓冲区
    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 client;

    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 = 8080;
    //创建DatagramSocket 对象,并指定该程序的通信端口为8080
    DatagramSocket receiveSocket = new DatagramSocket(port);
    while(true)
    {
    //创建接收缓冲区
    byte[] by = new byte[1024];
    //创建接收数据包
    DatagramPacket receivePacket = new DatagramPacket(by, by.length);
    //接收数据
    receiveSocket.receive(receivePacket);
    //解析消息并打印数据
    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.32.1"), 10000);
    receiveSocket.send(sendPscket);
    }

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

    }
    }

  • 相关阅读:
    Poj 2017 Speed Limit(水题)
    Poj 1316 Self Numbers(水题)
    Poj 1017 Packets(贪心策略)
    Poj 1017 Packets(贪心策略)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    Poj 2662,2909 Goldbach's Conjecture (素数判定)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2388 Who's in the Middle(快速排序求中位数)
    poj 2000 Gold Coins(水题)
    poj 2000 Gold Coins(水题)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/5192609.html
Copyright © 2011-2022 走看看