Java筑基34-网络编程02-UDP网络编程&网络编程案例

目录

一、 netstat指令

二、UDP网络通信编程

1.基本介绍和原理

2.基本流程

三、应用案例

1)UDP通信

2)TCP通信

3)UDP

4)tcp文件下载


扫描二维码关注公众号,回复: 16104522 查看本文章

一、 netstat指令

netstat -anb 查看端口被哪个程序监听

(以管理员身份运行命令行)

二、UDP网络通信编程

1.基本介绍和原理

2.基本流程

三、应用案例

1)UDP通信

思路分析:

package com.feiyang.basic16_net;

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

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
        //创建一个DatagramSocket对象,在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(9999);

        //构建一个DatagramPacket对象,准备接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        //调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        System.out.println("接收端A等待接收数据。。。");
        socket.receive(packet);

        //把packet进行拆包,取出数据,并显示
        int length = packet.getLength();
        byte[] data = packet.getData();
        System.out.println("接收端A接收到数据:" + new String(data, 0,length));

        //回应
        String s = "好的,明天见";
        System.out.println("接收端A发送数据:" + s);
        byte[] dataSend = s.getBytes();
        DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length, InetAddress.getByName("192.168.0.106"),9998);
        socket.send(packetSend);

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

package com.feiyang.basic16_net;

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 java.nio.charset.StandardCharsets;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class UDPSenderB {
    public static void main(String[] args) throws IOException {

        //创建DatagramSocket对象,在9998端口接收数据
        DatagramSocket socket = new DatagramSocket(9998);

        //将需要发送的数据,封装到DatagramPacket
        String s = "hello,明天去吃火锅啊";
        System.out.println("发送端B发送数据:" + s);
        byte[] bytes = s.getBytes();
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.0.106"),9999);
        //发送
        socket.send(packet);

        //构建一个DatagramPacket对象,准备接收数据
        byte[] bytesRe = new byte[1024];
        DatagramPacket packetRe = new DatagramPacket(bytesRe, bytesRe.length);
        //调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        System.out.println("发送端B等待接收数据。。。");
        socket.receive(packetRe);

        //把packet进行拆包,取出数据,并显示
        int length = packetRe.getLength();
        byte[] data = packetRe.getData();
        System.out.println("发送端B接收数据:" + new String(data, 0,length));

        //关闭资源
        socket.close();

    }
}

执行结果:

2)TCP通信

package com.feiyang.basic16_net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: socke通信,字符流,服务端
 */
public class Homework01Server {
    public static void main(String[] args) throws IOException {
        //1.在本机9999端口监听
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端在9999端口监听...");

        //2.当没有连接时,程序会阻塞,等待连接,如果有客户端连接,则会返回socket对象,程序继续
        Socket socket = serverSocket.accept();
        System.out.println("服务端socket=" + socket.getClass());

        //3.读取数据
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
        String s = bufferedReader.readLine();
        System.out.println("服务端接收=" + s);

        String answer = "";
        if("name".equals(s)){
            answer = "我是程序员飞扬";
        }else if("hobby".equals(s)){
            answer = "爱好编程";
        }else{
            answer = "你说啥子?";
        }

        //服务端发送消息
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write(answer);
        bufferedWriter.newLine();
        bufferedWriter.flush();

        //4.关闭流
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出。");

    }
}

package com.feiyang.basic16_net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description: socke通信,字符流,客户端
 */
public class Homework01Client {
    public static void main(String[] args) throws IOException {
        //1.连接服务端(IP,端口)
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端socket=" + socket.getClass());

        //2.连接上之后会返回一个socket对象,得到和socket关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();

        //3.写数据
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您要查询的内容:");
        String next = scanner.next();
        bufferedWriter.write(next);
        bufferedWriter.newLine();
        bufferedWriter.flush();

        //接收数据
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
        String s = bufferedReader.readLine();
        System.out.println("客户端接收=" + s);

        //4.关闭io流,关闭socket连接
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出。");
    }
}

执行结果:

3)UDP

package com.feiyang.basic16_net;

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

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class HomeworkReceiverA {
    public static void main(String[] args) throws IOException {
        //创建一个DatagramSocket对象,在9999端口接收数据
        DatagramSocket socket = new DatagramSocket(8888);

        //构建一个DatagramPacket对象,准备接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        //调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        System.out.println("接收端A等待接收数据。。。");
        socket.receive(packet);

        //把packet进行拆包,取出数据,并显示
        int length = packet.getLength();
        byte[] data = packet.getData();
        String s1 = new String(data, 0, length);
        System.out.println("接收端A接收到:" + s1);
        String answer ="";
        if("四大名著".equals(s1)){
            answer = "<<红楼梦>>、<<三国演义>>、<<水浒传>>、<<西游记>>";
        }else{
            answer = "您说的嘛?";
        }

        //回应
        System.out.println("接收端A发送数据:" + answer);
        String s = answer;
        byte[] dataSend = s.getBytes();
        DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length, InetAddress.getByName("192.168.0.106"),9998);
        socket.send(packetSend);

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

package com.feiyang.basic16_net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class HomeworkSenderB {
    public static void main(String[] args) throws IOException {

        //创建DatagramSocket对象,在9998端口接收数据
        DatagramSocket socket = new DatagramSocket(9998);

        //将需要发送的数据,封装到DatagramPacket
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入: ");
        String next = scanner.next();
        byte[] bytes = next.getBytes();
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.0.106"),8888);
        //发送
        socket.send(packet);

        //构建一个DatagramPacket对象,准备接收数据
        byte[] bytesRe = new byte[1024];
        DatagramPacket packetRe = new DatagramPacket(bytesRe, bytesRe.length);
        //调用接收方法,将通过网络传输的DatagramPacket对象填充到packet对象
        System.out.println("发送端B等待接收数据。。。");
        socket.receive(packetRe);

        //把packet进行拆包,取出数据,并显示
        int length = packetRe.getLength();
        byte[] data = packetRe.getData();
        System.out.println("发送端B接收到数据:" + new String(data, 0,length));

        //关闭资源
        socket.close();

    }
}

执行结果:

4)tcp文件下载

思路分析:

package com.feiyang.basic16_net;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class Homework03Server {
    public static void main(String[] args) throws IOException {
        //服务端在9999端口监听
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket = serverSocket.accept();

        InputStream inputStream = socket.getInputStream();
        String downLoadFileName="";

        /*byte[] bytes = new byte[1024];
        int len = 0;
        String downLoadFileName="";
        while((len = inputStream.read()) != -1){
            downLoadFileName += new String(bytes, 0, len);
        }
*/
        //获取文件名
        InputStreamReader isr = new InputStreamReader(inputStream, "utf-8"); //防止乱码
        BufferedReader bufferedReader = new BufferedReader(isr);
        String s = bufferedReader.readLine();
        downLoadFileName = s;
        System.out.println("文件名:" + downLoadFileName);

        //判断要下载的文件
        String filePath="";
        if("天国的女儿".equals(downLoadFileName)){
            filePath = "src\\天国的女儿.mp3";
        }else{
            //filePath = "src:\\aaa.mp3";
        }

        //读取对应目录下的文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
        byte[] bytes1 = StreamUtils.streamtoByteArray(bis);

        //将文件写会socke给客户端
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(bytes1);
        socket.shutdownOutput();

        //关闭资源
        bis.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出。。。");

    }
}

package com.feiyang.basic16_net;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * @author:飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class Homework03Client {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要下载的文件名: ");
        String s = scanner.next();

        //客户端将文件名写入socket,给服务端
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        OutputStream os = socket.getOutputStream();
        os.write(s.getBytes());
        socket.shutdownOutput();

        //获取服务端回写的文件流
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamtoByteArray(bis);
        String filePath = "d:\\" + s + ".mp3";

        //将文件写入指定路径的磁盘下
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        bos.write(bytes);
        bos.flush();

        //关闭资源
        bos.close();
        bis.close();
        os.close();
        socket.close();
        System.out.println("客户端下载完毕。。。");


    }
}

执行结果:

猜你喜欢

转载自blog.csdn.net/lu_xin5056/article/details/127135620