Java之TCP编程综合案例

1.反转案例

搭建一个TCP客户端,从键盘录入整行数据(遇到quit结束录入)然后发送给服务器,再接收服务器返回的数据并输出。

java 复制代码
package com.briup.chap12;

public class Test064_ReversalClient {
	public static void main(String[] args) throws Exception {
		//1.创建Socket对象(指定服务器ip port) 连接到服务器
		Socket socket = new Socket("127.0.0.1",8989);
		System.out.println("成功连接到 8989服务器,socket: " + socket);
		
		//2.获取数据传输的IO流
		InputStream is = socket.getInputStream();
		OutputStream os = socket.getOutputStream();
		
		//定义增强流 更好的实现功能
		// 打印流 写
		PrintStream ps = new PrintStream(os);
		// 缓冲流 读取
		Reader r = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(r);
		
		//3.核心业务:数据传输
		// 从键盘录入整行数据 发送给服务器,遇到quit结束录入
		Scanner sc = new Scanner(System.in);
		System.out.println("请录入发送数据: ");
		String line = null;
		while(true) {
			//录入数据  并发送
			line = sc.nextLine();
			ps.println(line);
			System.out.println("发送数据成功");
			
			if("quit".equals(line)) 
				break;
			
			//从服务器接收 返回的信息(反转字符串)
			String msg = br.readLine();
			System.out.println("接收信息: " + msg);
		}
		
		//4.关闭资源
		System.out.println("客户端即将关闭");
		br.close();
		ps.close();
		socket.close();
	}
}

搭建一个TCP服务器,逐行接收从客户端发送过来的字符串(读取到quit字符串则结束读取),然后对字符串进行反转,最后把反转的字符串返回给客户端。

java 复制代码
public class Test064_ReversalServer {
	//StringBuffer类测试
	public static void main00(String[] args) {
		StringBuffer sb = new StringBuffer();
		//追加内容
		sb.append("hello world");
		System.out.println(sb);
		
		//反转
		sb.reverse();
		System.out.println("反转后: " + sb);
		
		//获取长度
		int len = sb.length();
		
		//清空
		sb.delete(0, len);
		System.out.println("清空后: " + sb);
	}
	
	public static void main(String[] args) throws Exception {
		//1.搭建服务器
		ServerSocket server = new ServerSocket(8989);
		System.out.println("服务器成功启动,端口: 8989");
		
		//2.接收客户端连接
		Socket socket = server.accept(); 
		System.out.println("客户端成功连接: " + socket);
		
		//3.获取IO流并增强
		PrintStream ps = 
				new PrintStream(socket.getOutputStream());
		// 缓冲流 读取
		BufferedReader br = 
				new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		//4.业务操作
		//  4.1 逐行收取数据
		String line = null;
		// 可变字符序列类,类似String
		StringBuffer sb = new StringBuffer();
		while(true) {
			//清空序列
			sb.delete(0, sb.length());
			
			line = br.readLine();
			System.out.println("read: " + line);
			
			//读取到quit,则结束
			if("quit".equals(line))
				break;
			
			// 4.2 对收取的数据 进行 反转
			sb.append(line);
			//反转
			sb.reverse();
			//获取字符序列 包含的 字符串
			String msg = sb.toString();
			
			//4.3 将反转的字符串 返回给 客户端
			ps.println(msg);
			System.out.println("服务器 成功发送 反转信息...");
		}
		
		//5.关闭资源
		System.out.println("服务器即将关闭!");
		ps.close();
		br.close();
		socket.close();
		server.close();
	}
}

2. 传输对象

准备一个stud.txt文件,放到src/dir目录下,内容如下:

tex 复制代码
010.tom.19
001.zs.21
003.lucy.19
002.jack.20

搭建TCP客户端,逐行读取stud.txt中数据,然后转化为Student对象,最后将所有对象发送到服务器端。

Student基础类:

java 复制代码
package com.briup.chap12;

//注意,必须实现序列化接口
public class Student implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String id;
	private String name;
	private int age;
    
    //省略...
}

客户端代码:

java 复制代码
package com.briup.chap12;

/*
 * 逐行读取stud.txt中 数据 --> Student对象
 * 再将所有对象 发送到 服务器
 */
public class Test065_ObjectClient {
	public static void main(String[] args) throws Exception {
		//1.搭建客户端
		Socket socket = new Socket("127.0.0.1",8989);
		System.out.println("客户端成功连接,socket: " + socket);
		
		//2.获取流对象 并包装增强
		OutputStream os = socket.getOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(os);
		
		//3.解析文件 得到对象 并发送
		BufferedReader br = 
				new BufferedReader(new FileReader("src/dir/stud.txt"));
		String line = null;
		List<Student> list = new ArrayList<>();
		while((line = br.readLine()) != null) {
			//拆分数据 001.zs.20
			String[] arr = line.split("[.]");
			String id = arr[0];
			String name = arr[1];
			int age = Integer.parseInt(arr[2]);
			
			//封装学生对象 并添加到 list集合
			Student s = new Student(id,name,age);
			list.add(s);
		}
		
		// 发送集合(含所有学生)
		oos.writeObject(list);
		System.out.println("学生发送成功,数量: " + list.size());
		
		//4.关闭资源
		System.out.println("客户端即将关闭");
		oos.close();
		socket.close();
	}
}

搭建TCP服务器,接收从客户端发送过来的所有学生,然后遍历输出。

java 复制代码
package com.briup.chap12;

/*
 * 搭建服务器,接收从客户端发送过来的所有学生
 * 遍历输出
 */
public class Test065_ObjectServer {
	public static void main(String[] args) throws Exception {
		//1.搭建服务器,指定端口
		ServerSocket server = new ServerSocket(8989);
		System.out.println("服务器启动成功  端口 8989...");
		
		//2.接收客户端的连接
		Socket socket = server.accept();
		System.out.println("客户端成功连接:" + socket);
		
		//3.获取输入流 并 包装增强
		InputStream is = socket.getInputStream();
		ObjectInputStream ois = new ObjectInputStream(is);
		
		//4.接收 遍历数据
		List<Student> list = (List<Student>)ois.readObject();
		System.out.println("成功接收学生数量: " + list.size());
		for (Student s : list) {
			System.out.println(s);
		}
		
		//5.资源关闭
		System.out.println("服务器即将终止");
		ois.close();
		socket.close();
		server.close();
	}
}

3. 多线程案例

搭建一个TCP客户端,读取键盘信息,然后发送给服务器,遇到quit退出。

java 复制代码
package com.briup.chap12;

/*
 * 接盘录入信息  然后发给服务器,遇到quit结束
 */
public class Test066_ChatClient {
	public static void main(String[] args) throws Exception {
		//1.搭建客户端
		Socket socket = new Socket("127.0.0.1",8989);
		System.out.println("客户端成功连接,socket: " + socket);
		
		//2.封装得到IO流
		PrintStream ps = new PrintStream(socket.getOutputStream());
		
		//3.读取键盘信息 然后发送给服务器
		Scanner sc = new Scanner(System.in);
		String line = null;
		while(true) {
			line = sc.nextLine();
			if("quit".equals(line))
				break;
			
			ps.println(line);
		}
		
		//4.关闭资源
		System.out.println("客户端即将关闭");
		ps.close();
		socket.close();
	}
}

搭建TCP服务器,分离多线程接收客户端发送过来的数据,然后进行输出。

java 复制代码
package com.briup.chap12;

public class Test066_ChatServer {
	//多线程 服务器
	public static void main(String[] args) throws Exception {
		//1.搭建服务器,指定端口
		ServerSocket server = new ServerSocket(8989);
		System.out.println("服务器启动成功  端口 8989...");
		
		while(true) {
			//2.接收客户端的连接
			Socket socket = server.accept();
			System.out.println("客户端成功连接:" + socket);
			
			// 单独分离子线程 为 当前客户端提供服务
			Thread th = new Thread() {
				@Override
				public void run() {
					//1.获取IO流
					BufferedReader br = null;
					try {
						br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						//2.数据操作
						String line = null;
						while((line = br.readLine()) != null) {
							System.out.println("read: " + line);
						}
					}catch(Exception e) {
						e.printStackTrace();
					}finally {
						//3.关闭资源
						System.out.println("客户端对应资源即将关闭!");
						try {
							if(br != null)
								br.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
						try {
							if(socket != null)
								socket.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			};
			th.start();
		}
	}
	
	//实现 单线程服务器,接收多个客户端 聊天信息
	public static void main01(String[] args) throws Exception {
		//1.搭建服务器,指定端口
		ServerSocket server = new ServerSocket(8989);
		System.out.println("服务器启动成功  端口 8989...");
		
		while(true) {
			//2.接收客户端的连接
			Socket socket = server.accept();
			System.out.println("客户端成功连接:" + socket);
			
			//3.封装IO流对象,逐行读取聊天信息并输出
			BufferedReader br = 
					new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String line = null;
			while((line = br.readLine()) != null) {
				System.out.println("read: " + line);
			}
			
			//4.关闭资源
			System.out.println("客户端即将关闭: " + socket);
			br.close();
			socket.close();
			//能否关闭 server
		}
	}
}
相关推荐
陈王卜1 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 分钟前
Spring Boot 注解
java·spring boot
java亮小白19976 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF13 分钟前
java Queue 详解
java·队列
chnming198714 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙16 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂16 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc24 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
程序伍六七27 分钟前
day16
开发语言·c++
wkj00132 分钟前
php操作redis
开发语言·redis·php