Java 基于UDP的Socket网络编程的入门及示例

前言:天呐!这两天上班就像走钢丝啊,老大家里出事请假一周,手机关机,底层无人照看,机器又忙着定标,技术盲老板事事问我这个底层小白。做人好难呐。。。还是祝愿老大家里没有大碍吧,也保佑自己明天能安然度过。。保佑保佑。
原文出处:http://blog.csdn.net/u014158743/article/details/52928781

udp协议实现数据的基本发送与接收

UdpReceive

/**
 * 使用 udp协议实现数据的接收
 * 1:创建Socket端点,实现数据的接收,同时要监听端口
 * 2:创建用来接收数据的数据报包
 * 3:使用 Socket的接收功能接收数据
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

    System.out.println("接收方启动.....");

    //1:创建Socket端点,实现数据的接收
    DatagramSocket socket = new DatagramSocket(22222);

    //2:创建了一个空的数据报包用来接收数据
    byte[] arr = new byte[1024];
    DatagramPacket packet = new DatagramPacket(arr, arr.length);

    //3:使用 Socket的接收功能接收数据
    //接收数据就是从网络读取数据
    socket.receive(packet);

    //解析接收的数据
    //解析数据
    byte[]  data = packet.getData();//得到接收的数据
    String shuju = new String(data,0,packet.getLength());

    //得到发送方的ip地址
    InetAddress address = packet.getAddress();
    String ip = address.getHostAddress();

    //得到发送方发送数据使用的端口
    int port = packet.getPort();

    System.out.println(ip+":"+port+":"+shuju);

    socket.close();
}

UdpSend

/**
 * 使用udp协议实现数据的发送
 * 1:创建 Socket端点,实现数据的发送
 * 2:明确要发送的数据
 * 3:把要发送的数据打成数据报包
 * 4:使用 Socket的发送功能发送数据
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {

    System.out.println("发送方启动.....");
    //1:创建 Socket端点,实现数据的发送
    DatagramSocket socket  = new DatagramSocket();//明确了协议

    //2:明确要发送的数据
    String ss ="明天放假";
    byte[] data = ss.getBytes();

    //3:把要发送的数据打成数据报包
    //数据报包指明了发送的数据,接收数据的主机的Ip地址对象,接收数据的主机使用哪个端口接收
    DatagramPacket dp = new DatagramPacket(data,data.length, InetAddress.getByName("192.168.1.212"), 22222);

    //4:使用 Socket的发送功能发送数据
    //发送数据就是向网络输出数据,所以内部使用了输出流
    socket.send(dp);

    socket.close();

}

使用udp实现一直发送数据与接收数据

UdpSend

/**
 * 使用udp实现发送方可以一直发送
 * 1:创建 Socket端点
 * 2:循环读取键盘输入的数据,把每次读取的数据发出去
 * 3:关闭 Socket
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
     System.out.println("方式方启动.....");
        DatagramSocket s = new DatagramSocket();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while((line = br.readLine())!=null)
        {
         if("over".equals(line))
             break;
         byte[] arr = line.getBytes();

         DatagramPacket packet = new DatagramPacket(arr, arr.length, InetAddress.getByName("192.168.1.212"),33333);

         s.send(packet);
        }

        br.close();
        s.close();    
}

UdpReceive

/**
 *  使用udp实现接收方可以一直接收
 * @throws IOException 
 */
public static void main(String[] args) throws IOException {
    System.out.println("接收方启动....");
    DatagramSocket s = new DatagramSocket(33333);

    while(true)
    {
        byte[] arr = new byte[1024];

        DatagramPacket packet = new DatagramPacket(arr, arr.length);

        s.receive(packet);

        String data = new String(packet.getData(),0,packet.getLength());
        String ip = packet.getAddress().getHostAddress();
        System.out.println(ip+":"+data);
    }

    //s.close();
}

使用udp实现一个聊天程序

发送的同时可以接收 创建一个线程负责发送数据 创建一个线程负责接收数据

public class UdpChat {
    public static void main(String[] args) throws SocketException {

        DatagramSocket sendSocket = new DatagramSocket();
        DatagramSocket receiveSocket = new DatagramSocket(44444);

        new Thread(new Send(sendSocket)).start();
        new Thread(new Receive(receiveSocket)).start();

    }

}

// 定义发送线程的任务
class Send implements Runnable {
    private DatagramSocket socket;

    public Send(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // 任务是可以一直发送数据

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;

        try {
            while ((line = br.readLine()) != null) {
                byte[] data = line.getBytes();

                DatagramPacket packet = new DatagramPacket(data, data.length,
                        InetAddress.getByName("192.168.1.212"), 44444);

                socket.send(packet);

                if ("baibai".equals(line)) {
                    break;
                }
            }
            br.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

// 定义接收线程的任务
class Receive implements Runnable {
    private DatagramSocket socket;

    public Receive(DatagramSocket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        // 可以一直接收数据的任务
        try {
            while(true)
            {
                byte[] data = new byte[1024];
                DatagramPacket packet = new DatagramPacket(data, data.length);
                socket.receive(packet);
                String  shuju = new String(packet.getData(),0,packet.getLength());
                String  ip = packet.getAddress().getHostAddress();

                if("baibai".equals(shuju))
                {
                    System.out.println(ip+"离开了聊天室");
                }
                System.out.println(ip+":"+shuju);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

晚安,祝工作顺利。

猜你喜欢

转载自blog.csdn.net/u014158743/article/details/52928781