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

UDP:发送端send ——DatagramSocket 对象

             接受端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();
    
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值