java网络编程(1)-udp编程

时间:2022-04-07 16:13:06

Socket UDP通信

参考:http://blog.csdn.net/redarmy_chen/article/details/12784909

参考:http://blog.csdn.net/jiangxinyu/article/details/8161044

package com.udp;

import java.io.IOException;  

import java.net.DatagramPacket;  

import java.net.DatagramSocket;  

import java.net.InetAddress;  

import java.net.SocketException;  

  

public class Test1 {  

  

    // 发送者--->客户端 客户端--->发送者  

    // 发送者发给客户端数据,客户端返回数据给发送者  

    public static void send() {  

        System.out.println("---send----");  

        // 发送端  

        try {  

            // 创建发送方的套接字 对象 采用9004默认端口号  

            DatagramSocket socket = new DatagramSocket(8080);  

            // 发送的内容  

            String text = "hi 红军!";  

            byte[] buf = text.getBytes();  

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

            DatagramPacket packet = new DatagramPacket(buf,buf.length,  

                    InetAddress.getByName("localhost"), 8077);  

            // 从此套接字发送数据报包  

            socket.send(packet);  

            // 接收,                                                                                                  接收者返回的数据  

            displayReciveInfo(socket);  

            // 关闭此数据报套接字。  

            socket.close();  

        } catch (SocketExceptione) {  

            e.printStackTrace();  

        } catch (IOExceptione) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

    }  

  

    public static void recive() {  

        System.out.println("---recive---");  

        // 接收端  

        try {  

            //创建接收方的套接字 对象  并与send方法中DatagramPacketip地址与端口号一致  

            DatagramSocket socket = new DatagramSocket(8077,  

                    InetAddress.getByName("localhost"));  

            //接收数据的buf数组并指定大小  

            byte[] buf = new byte[1024];  

            //创建接收数据包,存储在buf  

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

            //接收操作  

            socket.receive(packet);  

            byte data[] =packet.getData();//接收的数据  

            InetAddress address = packet.getAddress();// 接收的地址  

            System.out.println("接收的文本:::" +new String(data));  

            System.out.println("接收的ip地址:::" +address.toString());  

            System.out.println("接收的端口::" +packet.getPort());// 9004  

  

            // 告诉发送者 我接收完毕了  

            String temp = "我接收完毕了";  

            byte buffer[] =temp.getBytes();  

            //创建数据报,指定发送给 发送者的socketaddress地址  

            DatagramPacket packet2 =new DatagramPacket(buffer,buffer.length,  

                    packet.getSocketAddress());  

            //发送  

            socket.send(packet2);  

            //关闭  

            socket.close();  

        } catch (SocketExceptione) {  

            e.printStackTrace();  

        } catch (IOExceptione) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

    }  

  

    /**

     * 接收数据并打印出来

     *  

     * @param socket

     * @throws IOException

     */  

    public static void displayReciveInfo(DatagramSocketsocket)  

            throws IOException {  

        byte[] buffer = new byte[1024];  

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

        socket.receive(packet);  

  

        byte data[] =packet.getData();//接收的数据  

        InetAddress address = packet.getAddress();// 接收的地址  

        System.out.println("返回的文本:::" +new String(data));  

        System.out.println("返回的ip地址:::" +address.toString());  

        System.out.println("返回的端口::" +packet.getPort());// 9004  

    }  

  

    public static void main(String[]args) {  

        new Thread() {  

            @Override  

            public void run() {  

                recive();  

            }  

        }.start();  

  

        new Thread() {  

            @Override  

            public void run() {  

                send();  

            }  

        }.start();  

  

    }  

}