Java网络编程04:UDP连接


不用连接,双方都可以发送消息,

发送端

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

/**
 * 不需要连接服务器
 */
public class Sender {

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

        /**
         * 1、定义服务端的IP地址和端口号
         */
        InetAddress ip = InetAddress.getByName("localhost");
        int port = 9999;

        /**
         * 2、建立socket连接
         */
        DatagramSocket socket = new DatagramSocket();

        /**
         * 3、建立包
         */
        String msg = "您好";
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, ip, port);

        /**
         * 4、发送包(无论服务端存不存在,都不会报错)
         */
        socket.send(packet);

        /**
         * 5、关闭资源
         */
        socket.close();
    }
}

接收端

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

/**
 * 还是要等待客户端的连接
 */
public class Receive {

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

        /**
         * 1、设置开放的端口
         */
        DatagramSocket socket = new DatagramSocket(9999);

        /**
         * 2、接收包
         */
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        /**
         * 3、读取包
         * packet.getData()返回字节数组,要转换为字符串输出
         */
        socket.receive(packet);
        System.out.println(packet.getAddress());
        System.out.println(new String(packet.getData(), 0, packet.getLength()));

        /**
         * 4、关闭资源
         */
        socket.close();
    }
}

UDP多线程交互聊天

发送线程

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class Sender implements Runnable{

    /**
     * 定义发送方端口号、接收方IP地址、接收方端口号
     */
    int fromPort;
    String toIp;
    int toPort;

    DatagramSocket socket;
    BufferedReader reader;

    public Sender(int fromPort, String toIp, int toPort){

        this.fromPort = fromPort;
        this.toIp = toIp;
        this.toPort = toPort;

        try {

            socket = new DatagramSocket(fromPort);

            /**
             * 由控制台读取数据发送消息
             */
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true) {

            try {

                String data = reader.readLine();
                byte[] buffer = data.getBytes();
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress(toIp, toPort));

                socket.send(packet);

                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        socket.close();
    }
}

接收线程

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receiver implements Runnable{

    int port;
    String fromName;

    DatagramSocket socket;

    public Receiver(int port, String fromName){

        this.port = port;
        this.fromName = fromName;

        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true) {

            try {

                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

                socket.receive(packet);

                String data = new String(packet.getData(), 0, packet.getLength());
                System.out.println(fromName + ":" + data);

                if (data.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        socket.close();
    }
}

Student

public class Student {

    public static void main(String[] args) {

        new Thread(new Sender(6666, "localhost", 7777)).start();
        new Thread(new Receiver(8888, "老师")).start();
    }
}

Teacher

public class Teacher {

    public static void main(String[] args) {

        new Thread(new Sender(9999, "localhost", 8888)).start();
        new Thread(new Receiver(7777, "学生")).start();
    }
}

URL

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Main {

    public static void main(String[] args) {

        try {

            URL url = new URL("https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ");

            /**
             * 获取URL的信息
             */
            System.out.println(url.getProtocol());
            System.out.println(url.getHost());
            System.out.println(url.getPort());
            System.out.println(url.getPath());
            System.out.println(url.getFile());

            /**
             * 下载URL资源,要转换为http
             */
            try {

                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                InputStream inputStream = urlConnection.getInputStream();
                FileOutputStream file = new FileOutputStream("file.png");

                byte[] buffer = new byte[1024];
                int count;

                while ((count = inputStream.read(buffer)) != -1){
                    file.write(buffer, 0, count);
                }

                file.close();
                inputStream.close();
                urlConnection.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }

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