Java高级Day38-网络编程作业

112.网络编程作业

//1.使用字符流的方式,编写一个客户端程序和服务器端程序
//2.客户端发送"name",服务器端接收到后,返回"我是nova"
//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"
//4.不是这两个问题,回复"你说啥呢"
​
​
===============//客户端//===============
public class SocketTCPClient {
    public static void main(String[] args) throws Exception {
        //1.连接服务端(ip,端口)
        //解读:连接本机的 9999端口,如果连接成功,返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//因为在本机监听,所以用LocalHost
        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();//如果使用字符流,需要手动刷新,否则数据不会写入数据通道
        //  设置写入结束标记
        socket.shutdownOutput();
​
        //4.获取和socket相关联的输入流,读取数据并显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);
​
        //5.关闭流对象和socket,必须关闭
        outputStream.close();
        socket.close();
        bufferedReader.close();//关闭外层流
        System.out.println("客户端退出了");
    }
}
​
​
​
===============//服务端//===============
public class SocketTCPServer {
    public static void main(String[] args) throws Exception {
        //1.在本机的 9999端口 监听,等待连接
        //  细节:要求在本机没有其他服务在监听9999
        //  细节:这个 ServerSocket 可以通过accpet() 返回多个Socket[多并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端,在9999端口监听,等待连接...");
        //2.当没有客户端连接9999端口时,程序会 阻塞,等待连接
        //  如果有客户端连接,则会返回Socket对象,程序继续
        Socket socket = serverSocket.accept();
​
        //3.通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
        InputStream inputStream = socket.getInputStream();
        //4.IO读取,使用字符流,用转换流(InputStreamReader)将InputStream转换成字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        String answer = "";
        if ("name".equals(s)){
            answer = "我是nova";
        }else if ("hobby".equals(s)){
            answer = "编写java程序";
        }else {
            answer = "你说啥呢";
        }
​
        //5.获取socket相关联的输出流
        OutputStream outputStream = socket.getOutputStream();
        //使用字符输出流的方式回复信息
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write(answer);
        bufferedWriter.newLine();//插入换行流,表示回复内容结束
        bufferedWriter.flush();//需要手动刷新
        //6.关闭流和socket
        bufferedWriter.close();
        socket.close();
        serverSocket.close();
        bufferedReader.close();
        System.out.println("服务器端退出了");
    }
}
//1.编写一个接收端A和一个发送端B,使用UDP协议完成
//2.接收端在8888端口等待接收数据(receive)
//3.发送端向接收端发送数据"四大名著是那些"
//4.接收端接收到发送端发送的问题后,返回"四大名著是'红楼梦'...",否则返回what?
//5.接收端和发送端程序退出
===============//ReceiverA//===============
public class UDPReceiverA {
    public static void main(String[] args) throws Exception {
        //1.创建一个DatagramSocket对象,准备在8888端口接收数据
        DatagramSocket socket = new DatagramSocket(8888);
        //2.构造一个 DatagramPacket对象
        //  一个数据包,最大是64k
        byte[] buf = new byte[64 * 1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        //3.调用 接受方法,将通过网络传输的 DatagramPacket对象填充到packet对象
        System.out.println("接收端 等待接收问题");
        socket.receive(packet);
        //4.可以把packet进行拆包,取出数据,并显示
        int length = packet.getLength();//实际接收到的数据字节长度
        byte[] data = packet.getData();//接收到数据
        String s = new String(data, 0, length);
        System.out.println(s);
        //判断接收到的信息是什么
        String answer = "";
        if("四大名著是那些".equals(s)){
            answer = "四大名著是'红楼梦'....";
        }else {
            answer = "what?";
        }
        
        //==回复信息给B端
        //将需要发送的数据,封装到DatagramPacket对象
        data = answer.getBytes();
        //封装的 DatagramPacket对象 data内容字节数组,data.length,主机(IP),端口
        packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(),8888);
        socket.send(packet);//发送
        //5.关闭资源
        socket.close();
    }
}
​
​
​
===============//SenderB//===============
public class UDPSenderB {
    public static void main(String[] args) throws Exception {
        //1.创建 DatagreamSocket 对象,准备在8888端口 接收数据
        DatagramSocket socket = new DatagramSocket(8888);//同一个机器没有两个相同的端口,所以用9998
        //2.将需要发送的数据,封装到DatagramPacket对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的问题?")
        String question = scanner.next();
        byte[] data = question.getBytes();
        //封装的 DatagramPacket对象 data内容字节数组,data.length,主机(IP),端口
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getLocalHost(),8888);
        socket.send(packet);
        //3.==接收从A端回复的信息
        //  (1)构造一个 DatagramPacket对象
        //  一个数据包,最大是64k
        byte[] buf = new byte[64 * 1024];
        packet = new DatagramPacket(buf, buf.length);
        //  (2)调用 接受方法,将通过网络传输的 DatagramPacket对象填充到packet对象
        //  当有数据包发送到9998端口时,就会接收到数据,如果没有数据包发送到,就会阻塞等待
        socket.receive(packet);
        //  (3)可以把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端退出");
    }
} 

113.TCP文件下载

//1.编写客户端程序和服务端程序
//2.客户端可以输入一个音乐文件名,比如高山流水,服务端收到音乐名后,可以给客户端返回这个音乐文件,如果服务器没有这个文件,返回一个默认的音乐即可
//3.客户端收到文件后,保存到本地e:\\
​
===============//SocketTCPServer//===============
public class SocketTCPServer {
    public static void main(String[] args) throws Exception {
        //1.监听 9999端口
        ServerSocket serverSocket = new ServerSocket(9999);
        //2.等待客户端连接
        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
        //若下载高山流水,就返回该文件,否则一律返回无名
​
        String resFileName = "";
        if ("高山流水".equals(downLoadFileName)){
            resFileName = "src\\高山流水.mp3";
        }else {
            resFileName = "src\\无名.mp3";
        }
​
        //4.创建一个输入流,读取文件
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(resFileName));
​
        //5.使用工具类StreamUtils,读取文件到一个字节数组
        byte[] bytes = StremUtils.streamToByArray(bis);
        //6.得到Socket关联的输出流
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        //7.写入到数据通道,返回给客户端
        bos.write(bytes);
        socket.shutdownOutput();
        //8.关闭相关资源
        bis.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出...");
    }
}
​
​
​
===============//SocketTCPClient//===============
public class SocketTCPClient {
    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);
        //3.获取和Socket关联的输出流
        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 = "e:\\" + downloadFileName + ".mp3";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        bos.write(bytes);
        //6.关闭相关资源
        bos.close();
        bis.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端下载完毕,正在推出...");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值