Java之tcp简单应用

实现简单 WebServer

要求服务器可以处理返回给客户单一段字符串,该字符串信息是读取服务器文件系统的文件,文件格式可以是 XML 文件或者 txt 文件。

分析

  1. 首先创建服务器并等待客户端接入,建立连接之后客户端发出读取文件请求。
  2. 服务器返回客户端请求的文件具体内容。
  3. 客户端接收。

效果图

在这里插入图片描述

具体实现代码

服务端

	/** 
* @author: lucky66
* @date:2020年11月2日 下午3:19:38 
* @Description:服务器代码
*/
public class Server {
    
    
	//path:指令和文件一一对应;
	private static Map<String,String> path = new  HashMap<String, String>();
	public static void main(String[] args) throws Exception{
    
    
		ServerSocket server = new ServerSocket(8888);
		Socket client = server.accept();   	// 等待客户端接入
		Scanner reader = new Scanner(client.getInputStream()); 	// 服务器接收客户端输入
		PrintStream pt = new PrintStream(client.getOutputStream()); // 服务器发送给客户端
		boolean flag = true; 	// 是否断开连接
		init(); 	// 初始化变量path的值
		while(flag) {
    
    
			if(reader.hasNext()) {
    
     
				String str = reader.next().trim();
				if("byebye".equalsIgnoreCase(str)) {
    
    
					pt.println("exit");
					flag = false;
				}
			else {
    
    
				if(path.containsKey(str)) {
    
    
						String text = readFile(getFile(path.get(str)));
						pt.println(text);   
					}
				else {
    
    
						pt.println("输入有误");
					}
				}
			}
		}
		reader.close();
		server.close();
	}
	
	public static void init() {
    
    
		path.put("1", "1.txt");
		path.put("2", "2.txt");
		path.put("3", "3.txt");
	}
	
	/*
	* getFile 返回目标文件对象
	*/
	public static File getFile(String num) throws Exception {
    
    
		File file = new File("D:\\java-2019-09\\project\\JavaDemo3\\src\\homeworkdemo2_2\\"+num);
		return file;
	}
	
	/*
	* readFile读取目标文件内容并返回
	*/
	public static String readFile(File file) throws Exception {
    
    
		FileInputStream input = new FileInputStream(file);
		Scanner scanner = new Scanner(new InputStreamReader(input)).useDelimiter("\r");
		/*
		 * 	把 \r 做文件读的分割符号,可以保留 \n
		 * 	读完最后一行之后无数据可以读,跳出while循环
		 * 	此时的result是存在 \n字符的,待客户端读取服务器发来的信息的时候就可以按照文本的内容换行输出了
		 */
		 
		String result = "";
		while(scanner.hasNext()) {
    
    
			result += scanner.next(); 
		}
		input.close();
		scanner.close();
		return result;
	}
}

客户端

/** 
* @author: lucky66
* @date:2020年11月2日 下午3:19:50
* @Description:客户端代码
*/
public class Client {
    
    
	// 首先定义一个接收键盘输入的字符流
	private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(new InputStreamReader(System.in));
	public static String getString(String str) throws Exception {
    
    
		return KEYBOARD_INPUT.readLine();
	}
	// 	可选内容
	public static void menu() {
    
    
		System.out.println("1、-----打开1.txt文件-----");
		System.out.println("2、-----打开2.txt文件-----");
		System.out.println("3、-----打开3.txt文件-----");
}
	public static void main(String[] args) throws Exception{
    
    
		Socket client = new Socket("127.0.0.1", 8888);
		Scanner input = new Scanner(client.getInputStream()).useDelimiter("\r");	// 接收服务器发来的信息,**用'\r'做分割符号**
		boolean flag = true;
		PrintStream pt = new PrintStream(client.getOutputStream()); // 客户端发送给服务器的流
		String str = "";
		while(flag) {
    
    
			menu();
			str =  getString("请输入你的操作");
			pt.println(str.trim());
			if(input.hasNext()) {
    
    
				System.out.println(input.next());
			}
			if("exit".equalsIgnoreCase(str)) {
    
    
				pt.print("byebye");
				flag=false;
			}
		}
		input.close();
		client.close();
	}
}

后记

读取文件内容后在控制台输出不换行问题:
首先要清楚scanner在接收输入流的时候会自动跳过开头的空白符,然后对输入的内容进行检查,直到再次遇到空白格或者回车换行结束接收。
从问题出现的地方入手,考虑到Scanner默认遇到空白符结束内容接收,我们的文本中有大量的空白格。如果不对这点做改变,最后会出现读取不换行的问题。
在这里插入图片描述

不换行的原因就是"\n"被吃掉了,为将换行符保留下来,我们通过Scanner.useDelimiter("\r")方法更改分隔符为回车键,从而保留换行符。
接下来要思考的问题就是客户端如何顺利接收服务端发来的信息
在这里插入图片描述

文本文件内容最后一行往往都不是以回车换行符结束的,我们可以在服务端发给客户端的时候采用println(),如此我们客户端接收到的信息最后就是以"\r\n"结束的,客户端在接受信息的时候就可以使用"\r"分割符接收信息,准确打印所有内容。

猜你喜欢

转载自blog.csdn.net/weixin_43745087/article/details/112253292
今日推荐