实验六:Java流式编程与网络程序设计

一、字节输入/输出流实现数据的保存和读取

编程要求

根据提示,在右侧编辑器补充代码。 编写应用程序(SortArray.java),使用字节输入/输出流实现数据的保存和读取。 要求功能如下:

  • 输入1~100之间的整型数据保存到数组(数组大小为10)中
  • 将数组排序(由小到大)后的元素保存到指定的文件中
  • 如果文件不存在,则创建文件
  • 从文件中读取排序后的元素并按指定格式输出
  • 利用异常处理机制处理可能发生的错误

测试说明

平台会对你编写的代码进行测试:

测试输入:70 94 21 43 76 60 70 37 75 80

预期输出: 21<37<43<60<70<70<75<76<80<94

代码

package step2;
import java.io.*;
import java.util.Scanner;

public class Encrypt {
	public static void main(String[] args) throws IOException {

		// 创建要发送的电报
		Scanner sc = new Scanner(System.in);
		String data = sc.next();

		// 将电报分割成字符数组
		/********** Begin **********/
		char[] area = data.toCharArray();

		/********** End **********/

		// 打开指定存放电报的文件,如果文件不存在,则创建
		File file = new File("data.txt");
		if (!file.exists()) {
			file.createNewFile();
		}
		// 循环遍历字符数组,将每个字符加密处理
		for (int i = 0; i < area.length; i++) {
			area[i] = (char) (area[i] ^ 'q');
		}
		// 利用字符输出流FileWriter将加密后的字符数组写入文件中
		/********** Begin **********/
		FileWriter fw = new FileWriter(file);
		fw.write(area);
		fw.flush();
		fw.close();
		/********** End **********/
		// 利用字符输入流FileReader读取文件,将密文输出
		/********** Begin **********/
		FileReader fr1 = new FileReader(file);
		char[] buf1 = new char[10];
		int n;
		System.out.println("密文:");
		while ((n = fr1.read(buf1)) != -1) {
			String s = new String(buf1);
			System.out.print(s);
		}
		System.out.println();
		fr1.close();
		/********** End **********/
		// 利用字符输入流FileReader读取文件,将密文转换为明文输出
		/********** Begin **********/
		FileReader fr2 = new FileReader(file);
		char[] buf2 = new char[10];
		System.out.println("明文:");
		while ((n = fr2.read(buf2)) != -1) {
			for (int i = 0; i < n; i++) {
				buf2[i] = (char) (buf2[i] ^ 'q');
			}
			String s = new String(buf2);
			System.out.print(s);
		}
		fr2.close();
		/********** End **********/
	}
}

二、字符输入/输出流实现发送电报

编程要求

根据提示,在右侧编辑器补充代码。

  • 电报内容经过加密后使用字符输出流存储在指定的文件中
  • 如果文件不存在,则创建文件
  • 使用字符输入流从文件中分别读取密文和明文的内容并显示出来
  • 利用异常处理机制处理可能发生的错误

注意:在对字符加密时采用了异或(^q)的简单字符加密处理,解密时也要进行逐个字符异或(^q)的处理。

测试说明

平台会对你编写的代码进行测试:

测试输入: 今晚10点发动总攻

预期输出: 密文: 亻昫@A烈厠務恊敊 明文: 今晚10点发动总攻

代码

package step2;
import java.io.*;
import java.util.Scanner;

public class Encrypt {
	public static void main(String[] args) throws IOException {

		// 创建要发送的电报
		Scanner sc = new Scanner(System.in);
		String data = sc.next();

		// 将电报分割成字符数组
		/********** Begin **********/
		char[] area = data.toCharArray();

		/********** End **********/

		// 打开指定存放电报的文件,如果文件不存在,则创建
		File file = new File("data.txt");
		if (!file.exists()) {
			file.createNewFile();
		}
		// 循环遍历字符数组,将每个字符加密处理
		for (int i = 0; i < area.length; i++) {
			area[i] = (char) (area[i] ^ 'q');
		}
		// 利用字符输出流FileWriter将加密后的字符数组写入文件中
		/********** Begin **********/
		FileWriter fw = new FileWriter(file);
		fw.write(area);
		fw.flush();
		fw.close();
		/********** End **********/
		// 利用字符输入流FileReader读取文件,将密文输出
		/********** Begin **********/
		FileReader fr1 = new FileReader(file);
		char[] buf1 = new char[10];
		int n;
		System.out.println("密文:");
		while ((n = fr1.read(buf1)) != -1) {
			String s = new String(buf1);
			System.out.print(s);
		}
		System.out.println();
		fr1.close();
		/********** End **********/
		// 利用字符输入流FileReader读取文件,将密文转换为明文输出
		/********** Begin **********/
		FileReader fr2 = new FileReader(file);
		char[] buf2 = new char[10];
		System.out.println("明文:");
		while ((n = fr2.read(buf2)) != -1) {
			for (int i = 0; i < n; i++) {
				buf2[i] = (char) (buf2[i] ^ 'q');
			}
			String s = new String(buf2);
			System.out.print(s);
		}
		fr2.close();
		/********** End **********/
	}
}

三、简单TCP通信

编程要求

根据提示,在右侧编辑器补充代码,使用Socket和ServerSocket套接字编程,完成简单的TCP通信。

测试说明

平台会对你编写的代码进行测试:

测试输入:张三

预期输出: 你已经连上服务器了,告诉我你的姓名... 再见:张三

代码

package step3;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws Exception {
        Server server = new Server();
        server.start();
        Scanner sc = new Scanner(System.in);

        //创建客户端Socket(s),指定服务器端IP地址和端口号
        /********** Begin **********/
        Socket s = new Socket("127.0.0.1", 8000);
        /**********  end  **********/
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
        DataInputStream dis = new DataInputStream(s.getInputStream());
        System.out.println(dis.readUTF());
        String name = sc.next();
        dos.writeUTF(name);
        System.out.println(dis.readUTF());
        s.close();
    }
}
package step3;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {

    @Override
    public void run() {
        try {
            //创建服务器端ServerSocket(ss),指定端口号8000
            /********** Begin **********/
            ServerSocket ss =new ServerSocket(8000);
            /**********  end  **********/
            Socket s = ss.accept();
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            DataInputStream dis = new DataInputStream(s.getInputStream());
            dos.writeUTF("你已经连上服务器了,告诉我你的姓名...");
            String name = dis.readUTF();
            dos.writeUTF("再见:" + name);
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、TCP通信实现奇偶数判断

编程要求

根据提示,在右侧编辑器补充代码,对输入的整数进行奇偶性判断;当输入的整数为-1时,程序结束运行。

测试说明

平台会对你编写的代码进行测试:

测试输入:1 2 3 4 -1

预期输出: 请输入一个整数,我知道是奇数还是偶数 1是...奇数 2是...偶数 3是...奇数 4是...偶数

代码

 package step4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class ClientPlus {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ServerPlus server = new ServerPlus();
		server.start();
		try {
			//创建客户端Socket(s),指定服务器端IP地址和端口号
			/********** Begin **********/
            Socket s = new Socket("127.0.0.1", 8000);
			/**********  end  **********/
			DataOutputStream dos = new DataOutputStream(s.getOutputStream());
			DataInputStream dis = new DataInputStream(s.getInputStream());
			//客户端通过循环依次接收服务器返回的结果,并输入新的整数传递给服务器
			/********** Begin **********/
            while(true){
				System.out.println(dis.readUTF());
				String num = sc.next();
				dos.writeUTF(num);
			}
			/**********  end  **********/
		} catch (EOFException e) {
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package step4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerPlus extends Thread {
	@Override
	public void run() {
		try {
			
            /********** Begin **********/
            //创建服务器端ServerSocket(ss),指定端口号8000
            ServerSocket ss = new ServerSocket(8000);
            /**********  end  **********/
			Socket s = ss.accept();
			DataOutputStream dos = new DataOutputStream(s.getOutputStream());
			DataInputStream dis = new DataInputStream(s.getInputStream());
			ReceiveThread thread = new ReceiveThread(s, dos, dis);
			thread.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
 package step4;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;

class ReceiveThread extends Thread {
	DataOutputStream dos;
	DataInputStream dis;
	Socket s;
	public ReceiveThread(Socket s, DataOutputStream dos, DataInputStream dis) {
		this.s = s;
		this.dos = dos;
		this.dis = dis;
	}
	@Override
	public void run() {
		try {
			dos.writeUTF("请输入一个整数,我知道是奇数还是偶数");
			while(true) {
				String num = dis.readUTF();
				if("-1".equals(num)) {
					s.close();
					break;
				} 
				String result = (Integer.parseInt(num)%2==0)?"偶数":"奇数";
				dos.writeUTF(num + "是..." + result);
			}			
		} catch (SocketException e) {
			try {
				s.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		} catch (IOException e) {
			System.out.println("数据读取异常");
		} 
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值