韩顺平Java P675- 687 学习笔记

本文介绍了端口监听在网络通信中的作用,以及Java中实现UDP和TCP通信的示例代码。通过端口监听,应用程序可以在特定端口等待连接或数据,实现多服务共存。示例展示了UDPReceiverA和UDPSenderB的简单通信,以及TCP客户端Homework01Client和服务端Homework01Server的交互过程。
摘要由CSDN通过智能技术生成

老韩课上涉及到的代码都是全的。

 端口监听

在计算机网络中,端口是用于标识不同应用程序或网络服务的数字。端口号范围从0到65535,其中0到1023是被公认的端口,用于一些常见的网络服务,比如HTTP(端口号80)和HTTPS(端口号443)。其他的端口号则用于不同的应用程序或自定义服务。

端口监听是指一种网络应用程序或服务通过监听特定端口,以便接受传入的网络连接或数据流。当一个应用程序或服务在特定端口上进行监听时,它会在该端口上等待传入的连接或数据。

当其他计算机或网络设备尝试与监听端口建立连接时,应用程序或服务会接受连接,并开始进行通信。这种通信可以是数据的传输、命令的执行或其他类型的网络交互,具体取决于应用程序或服务的功能和设计。

端口监听对于网络通信和服务器应用非常重要。通过监听不同的端口,不同的应用程序或服务可以同时在同一台计算机上运行,而无需冲突或互相干扰。网络管理员可以配置防火墙和路由器,以控制特定端口的访问权限,从而增加网络的安全性。

总结起来,端口监听是一种网络应用程序或服务在特定端口上等待传入连接或数据的过程,以实现网络通信和数据交换。

 接收端

package com.hspedu.udp;

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

/**
 * @author abner
 * @version 1.0
 */
public class UDPReceiverA {
    public static void main(String[] args) throws IOException {
//1.创建一个DatagramSocket对象,准备在9999接收数据
        DatagramSocket socket = new DatagramSocket(9999);
//2.构建一个DatagramPacket对象,准备接收数据
        //在前面讲解UDP协议时,老师说过一个数据包最大64
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        ///3.调用接收方法,将通过网络传输的DatagramPacket对象
        System.out.println("接收端A 等待接收数据、、");
        socket.receive(packet);
//老师提示:当有数据包发送到本机的9999端口时,就会接收到数据
   //1
        int length = packet.getLength();
        byte[] data = packet.getData();

        String s = new String(data, 0, length);
        System.out.println(s);
        //5.关闭资源


        //如果没有数据包发送到本机的9999端口,就会阻塞
//4。可以把packet进行拆包,取出数据,并显示。

    }
}

发送端

package com.hspedu.udp;

import java.net.*;
import java.nio.charset.StandardCharsets;

/**
 * @author abner
 * @version 1.0
 */
public class UDPSenderB {
    public static void main(String[] args) throws SocketException, UnknownHostException {
//创建DatagramSocket对象,准备发送和接收数据
        DatagramSocket socket = new DatagramSocket(9998);
        //如果有人给你发数据,准备在9998

//2。将需要发送的数据,封装到DatagramPacket对象
        byte[] data = "hello 明天吃火锅".getBytes(StandardCharsets.UTF_8);
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.175.84"), 9999);


    }
}

作业1

客户端

package com.hspedu.homework;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * @author abner
 * @version 1.0
 */
public class Homework01Client {
    public static void main(String[] args) throws IOException {
//思路
//1。连接服第端(ip,端口)
        //解读:连接本机的9999端口,如果连接成功,返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端 socket返回=" +socket.getClass());

//2。连接上后,生成Socket,通过
//socket.getOutputstream()
        //  得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
//3。通过输出流,写入数据到数据通道
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        //从键盘读取用户的数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的问题");
        String question = scanner.next();
        bufferedWriter.write(question);

        bufferedWriter.newLine();//插入换行符,表示写入内容结束,要求对方使用readline!!!!!
        bufferedWriter.flush();//需要手动刷新


        outputStream.write("hello ,server".getBytes(StandardCharsets.UTF_8));
        socket.shutdownOutput();
        //4。获取和socket关联的输入流。读取数据(字节),并显示
        InputStream inputStream = socket.getInputStream();
//        byte[] buf = new byte[1024];
//        int readLen = 0;
//        while ((readLen = inputStream.read(buf)) != -1){
//            System.out.println(new String(buf,0,readLen));
//        }
        //
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);


        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出");
    }
}

服务端

package com.hspedu.homework;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author abner
 * @version 1.0
 *
 */
public class Homework01Server {
    public static void main(String[] args) throws IOException {
//思路
//1。在本机的9999端口监听,等待连接
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器等待中、、、、");
//2。当没有客户端连接9999端口时,程序会
//        11
        Socket socket = serverSocket.accept();

//        阻塞,等待连接
3.通过socket.getInputstream()读取
        InputStream inputStream = socket.getInputStream();


//
//        客户端写入到数据通道的数据,
//        byte[] buf = new byte[1024];
//        int readLen = 0;
//        while ((readLen = inputStream.read(buf)) != -1){
//            System.out.println(new String(buf,0,readLen));
//        }
//4.I0读取,使用字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        //使用了转换流
        String s = bufferedReader.readLine();

        String answer = "";
        if("name".equals(s)){
            answer = "我是felix";
        }else if("hobby".equals(s)){
            answer = "编写Java程序";
        }else {
            answer ="你说的啥子";
        }


        OutputStream outputStream = socket.getOutputStream();
//        outputStream.write("hello, client".getBytes(StandardCharsets.UTF_8));
//        socket.shutdownOutput();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write(answer);
        bufferedWriter.newLine();//插入一个换行符
        //回复内容的结束
        bufferedWriter.flush();//需要手动刷新


        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
//        显示

    }
}

如果问多次,就是一个聊天系统

就是加一个循环,就是while,让你出不去

作业二

发送端

package com.hspedu.homework;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * @author abner
 * @version 1.0
 */
public class Homework02SenderB {
    public static void main(String[] args) throws IOException {
//创建DatagramSocket对象,准备发送和接收数据
        DatagramSocket socket = new DatagramSocket(9998);
        //如果有人给你发数据,准备在9998

//2。将需要发送的数据,封装到DatagramPacket对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的问题:");
        String question = scanner.next();
        byte[] data =question.getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.60.1"), 8888);

        socket.send(packet);
        byte[] buf = new byte[1024];
        packet = new DatagramPacket(buf, buf.length);

        socket.receive(packet);

        int length = packet.getLength();
        data = packet.getData();
        String s = new String(data,0,length);
        System.out.println(s);
        socket.close();
        System.out.println("B端退出");
    }
}

接收端

package com.hspedu.homework;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

/**
 * @author abner
 * @version 1.0
 */
public class Homework02ReceiverA {
    public static void main(String[] args) throws IOException {
//1.创建一个DatagramSocket对象,准备在9999接收数据
        DatagramSocket socket = new DatagramSocket(8888);
//2.构建一个DatagramPacket对象,准备接收数据
        //在前面讲解UDP协议时,老师说过一个数据包最大64
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        ///3.调用接收方法,将通过网络传输的DatagramPacket对象
        System.out.println("接收端A 等待接收数据、、");
        socket.receive(packet);
//老师提示:当有数据包发送到本机的9999端口时,就会接收到数据
   //1
        int length = packet.getLength();
        byte[] data = packet.getData();

        String s = new String(data, 0, length);
        String answer = "";
        if("四大名著是哪些".equals(s)){
            answer = "四大名著 红楼梦 西游记 水浒传 三棍演义";
        }else {
            answer = "what";
        }

        data = answer.getBytes();
        packet = new DatagramPacket(data,data.length,InetAddress.getByName("192.168.60.1"), 9998);

        socket.send(packet);
        socket.close();
        System.out.println("A端退出、、、");




        //5.关闭资源


        //如果没有数据包发送到本机的9999端口,就会阻塞
//4。可以把packet进行拆包,取出数据,并显示。


//        DatagramSocket socket01 = new DatagramSocket(9999);
//        //如果有人给你发数据,准备在9998
//
2。将需要发送的数据,封装到DatagramPacket对象
//        byte[] data01 = "四大名著是三国演义、水浒传、、".getBytes(StandardCharsets.UTF_8);
//        DatagramPacket packet01 = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.175.84"), 9998);
//



    }
}

之前因为ip地址换了,弄的我搞了半天都没有反馈结果,查了半天原因。

homework03

服务端

package com.hspedu.homework;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author abner
 * @version 1.0
 * 先写文件下载的服务端
 *
 */
public class Homework03Server {
    public static void main(String[] args) throws Exception {
        //1 创建socket 监听 9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //2 等待客户端连接
        System.out.println("服务端,在9999端口监听,等待下载文件");
        Socket socket = serverSocket.accept();
        //3 读取 客户端发送要下载的文件名
        //这里老师使用了while 读取文件名,考虑到了将来数据较大的情况
        InputStream inputStream = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        String downLoadFileName = "";
        while ((len = inputStream.read(b)) != -1){
            downLoadFileName += new String(b,0,len);
        }
        System.out.println("客户端希望下载文件名="+downLoadFileName);

        //老师在服务器上有两个文件,无名.mp3高山流水.mp3
        //如果客户下载的是高山流水我们就返回该文件,否则一律返回无名.m3
        String resFileName = "";
        if("高山流水".equals(downLoadFileName)){
            resFileName = "src\\高山流水.mp4";
        }else {
            resFileName = "src\\meeting_01.mp4";
        }
        //4 创建一个输入流读取文件
        BufferedInputStream bis =
                new BufferedInputStream(new FileInputStream(resFileName));

        //5 使用工具类streamutils工具类,读取文件到一个字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bis);

        //6 得到关联的输出流
        BufferedOutputStream bos =
                new BufferedOutputStream(socket.getOutputStream());
        //7 写入到数据通道 返回给客户端
        bos.write(bytes);
        socket.shutdownOutput();

        //8 关闭相关的资源
        bis.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端结束、、、");

    }
}

客户端

package com.hspedu.homework;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;

/**
 * @author abner
 * @version 1.0
 * 文件下载的客户端
 */
public class Homework03Client {
    public static void main(String[] args) throws Exception {

        //1 接收用户输入,指定下载文件名
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入下载文件名");
        String downloadFileName = scanner.next();
        
        //2 客户端连接服务器,准备发送
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(downloadFileName.getBytes());
        //设置写入结束的标志
        socket.shutdownOutput();

        //4 读取服务端返回的文件(字节数据)
        BufferedInputStream bis
                = new BufferedInputStream(socket.getInputStream());
        byte[] bytes = StreamUtils.streamToByteArray(bis);
        //5 得到一个输出流,准备将bytes写入到磁盘文件
        //比如下砸的就是高山流水,  给的就是高山流水
        //除此之外,下载的就是无名
        String filePath = "d:\\"+ downloadFileName +".mp3";
        BufferedOutputStream bos =
                new BufferedOutputStream(new FileOutputStream(filePath));
        bos.write(bytes);
        //6 关闭后相关的资源
        bos.close();
        bis.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端下载完毕,正确退出");

    }
}
package com.hspedu.homework;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamUtils {
    public static byte[] streamToByteArray(InputStream is) throws Exception {
        // 创建输出流对象
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // 字节数组
        byte[] b = new byte[1024];
        int len;
        while ((len = is.read(b)) != -1) {
            // 循环读取
            // 把读取到的数据,写入 bos
            bos.write(b, 0, len);
        }
        byte[] array = bos.toByteArray();
        bos.close();
        return array;
    }

    public static String streamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line + "\r\n");
        }
        return builder.toString();
    }
}

上面是工具类

迎面走来的是华野二师英模方阵,领队是李云龙少将与赵刚少将,华野二师成立于1947年,前身为八路军386旅独立团,该部1935年参加红军长征,抗战期间击溃坂田联队,李家坡之战,围歼敌山崎大队,伏击日华北军官团,在平安县城摧毁日本山本特战队,涌现出迫击炮神王承柱,投弹神手王根生,大刀队长张大彪,武术高手魏大勇,段鹏,骑兵连长孙德胜等一大批优秀战士 ,为抗日战争,解放战争做出重大贡献让我们向二师致敬!向英雄致敬!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值