当前位置: 首页 > news >正文

Java之TCP编程综合案例

1.反转案例

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

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字符串则结束读取),然后对字符串进行反转,最后把反转的字符串返回给客户端。

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;// 可变字符序列类,类似StringStringBuffer 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目录下,内容如下:

010.tom.19
001.zs.21
003.lucy.19
002.jack.20

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

Student基础类:

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

客户端代码:

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.20String[] 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服务器,接收从客户端发送过来的所有学生,然后遍历输出。

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退出。

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服务器,分离多线程接收客户端发送过来的数据,然后进行输出。

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() {@Overridepublic 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}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 卷积神经网络的相关知识点
  • C++相关概念和易错语法(25)(列表初始化、initializer_list)
  • 【云原生】Prometheus Pushgateway使用详解
  • Java对象头里有哪些信息
  • 如何在linux系统上部署Redis
  • Android12修改设备名称
  • ARM相关知识概括
  • GitHub的详细介绍
  • python-flask-上传多个文件并存储
  • 有效的字母异位词 | LeetCode-242 | 哈希集合 | 哈希数组
  • LNMP环境搭建论坛
  • 【论文解读】Performance comparison among popular implementations of H.264 encoders
  • 【Bug分析】Keil报错:error: #18:expected a “)“问题解决
  • OpenGL入门一:基础知识及概念
  • [C++] 深入理解面向对象编程特性 : 继承
  • 【5+】跨webview多页面 触发事件(二)
  • Codepen 每日精选(2018-3-25)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • HTTP中GET与POST的区别 99%的错误认识
  • IDEA常用插件整理
  • java8 Stream Pipelines 浅析
  • SQLServer之创建显式事务
  • Unix命令
  • Vue2 SSR 的优化之旅
  • vue-loader 源码解析系列之 selector
  • windows下使用nginx调试简介
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 前嗅ForeSpider教程:创建模板
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用权重正则化较少模型过拟合
  • 为什么要用IPython/Jupyter?
  • 新版博客前端前瞻
  • 一些关于Rust在2019年的思考
  • 运行时添加log4j2的appender
  • 06-01 点餐小程序前台界面搭建
  • 如何在招聘中考核.NET架构师
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • #includecmath
  • $nextTick的使用场景介绍
  • (20050108)又读《平凡的世界》
  • (70min)字节暑假实习二面(已挂)
  • (C语言)球球大作战
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)区间调度问题
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET : 在VS2008中计算代码度量值
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net Core缓存组件(MemoryCache)源码解析