您的位置:首页 > 理论基础 > 计算机网络

网络编程 UDP入门及无限聊天

2017-06-28 22:32 344 查看
UDP:发送端send ——DatagramSocket 对象
4000

             接受端receive——DatagramSocket 对象

import java.io.BufferedReader;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.net.UnknownHostException;

import collection.InputStreamReader;

/**

 * udp的发送端

 * @author Administrator

 *    1:建立udp的socket服务

    2:将要发送的数据封装成数据包

    3:通过udp的socket服务,将数据包发送出

    4:关闭资源

 */

public class UDPsend {

    /**

     * DatagramSocket    socket对象

     * 构造  

     * DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。

          DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。

           方法:

        public void send(DatagramPacket p);发送数据包,参数类型为:DatagramPacket

         DatagramPacket数据包对象

            构造 DatagramPacket(byte[] buf, int length, InetAddress address, int port)

                              需要发送的数据, 发送的数据长度,        接收端ip对象,    接收端的端口号

                  构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。     

                  

     * @throws IOException

     */

        public static void main(String[] args) throws IOException{

            //1创建socket服务

            DatagramSocket ds=new DatagramSocket(2000);

            

          //2封装数据(打包)

            byte[] data="哈哈朋友您们好e ij e ij".getBytes();

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

           DatagramPacket dp=new DatagramPacket(data,data.length,ip,10000);

          //3通过DatagramSocket对象的方法发送封装好的数据

                ds.send(dp);

         // 4关闭资源

                ds.close();

            

        }

    
}

/**

 * udp的接收端

 * @author Administrator

 *

 */

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class UDPRecive {

    /**构造:

     * DatagramSocket(int port) ;//创建DatagramSocket接收端的对象,指定端口号

     *

     * 方法:

     * void receive(DatagramPacket p) 从此套接字接收数据报包 ,参数类型:数据包的对象DatagramPacket

     *

     * DatagramPacket

     * 构造

     * DatagramPacket(byte[] buf, int length) 用来接收长度为 length 的数据包。

     * 方法

     *  int getLength()  返回将要发送或接收到的数据的长度。

     *   InetAddress getAddress()  返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

     *  int getPort()  ; 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

     * @param args

     * @throws IOException

     */

        public static void main(String[] arags) throws IOException{

            //创建接受端DatagramSocket 的对象,指定端口

            DatagramSocket ds=new DatagramSocket(10000);

            

            //创建DatagramPacket接受数据包对象

            byte[] buf=new byte[1024];

            DatagramPacket dp=new DatagramPacket(buf,buf.length);

            //创建Socket对象的receive方法,接受数据包

            ds.receive(dp);

            //拆包

            int length=dp.getLength();

            InetAddress ip=dp.getAddress();

            int port=dp.getPort();

            System.out.println("发送端的ip对象"+ip+" 端口号"+port);

            System.out.println("数据"+new String(buf,0,length));

            //关闭资源

            ds.close();

            

            

        }

}

UDP实现无限聊天


/*

 * 实现UDP协议 发送端

 *  1. 创建数据包对象,封装数据,IP,端口号 DatagramPacket

 *  2. 创建数据包Socket投递对象 DatagramSocket

 *  3. 投递对象方法send发生数据包

 *  4. 关闭资源

 *  

 *  要求: 发送的数据,必须是键盘输入来的(禁止使用Scanner)

 *  System.in+转换流+缓冲区readerLine

 *  输入一行,发送一行 循环,死循环

 */

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class UDPchatSend{

    public static void main(String[] args) throws IOException{

        //创建Socket服务

        DatagramSocket ds=new DatagramSocket(10890);

        //键盘录入

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        String line=null;

        while((line=br.readLine())!=null){

                //创建数据包对象,封装数据,IP,端口号,datagramSocket

                byte[] by=line.getBytes();

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

                DatagramPacket dp=new DatagramPacket(by,by.length,ip,20000);

                //发送对象方法send发送数据包

                ds.send(dp);

                if("886".equals(line)){

                         break;

                }

                

        }

        //关闭资源

        ds.close();

        

    }

}

/*

 * UDP的接收端

 *  1. 创建接收对象DatagramSocket , 传递端口

 *  2. 创建数据包对象DatagramPacket, 接收字节数组

 *  3. 接收对象DatagramSocket方法 receive接收数据包--线程阻塞效果,等着接收,如果没有发送,永久等待

 *  4. 使用DatagramPacket方法,进行拆包

 *  5. 关闭资源

 */

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class UDPreceiveChat {

    public static void main(String[] args) throws IOException{

        //1创建接受端指定的DatagramSocket的对象,指定端口号

        DatagramSocket ds=new DatagramSocket(10000);

        //2创建DatagramPacket接受数据包对象

        byte[] bu=new byte[1024];

        while(true){

                DatagramPacket dp=new DatagramPacket(bu,bu.length);

                //3通过Socket对象的receive方法,接受数据包

                ds.receive(dp);

                //4拆包

                int length=dp.getLength();//获取真实接受的数据的长度

                int port=dp.getPort();//获取真实的端口

                String ip=dp.getAddress() .getHostAddress();//获取真实ip地址

                String message=new String(bu,0,length);

                if("886".equals(message)){

                        System.out.println(".."+ip+"  "+port+"下线");

                        break;

                }else{

                    System.out.println(message+".."+port+".."+ip);

                }

        

        

        }

        //关闭资源

        ds.close();

    

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: