javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天
上一篇学习了javaIO里面的 PipedReader 和 PipedWriter,这里对两个类做一个小小的练习:实现一个即时消息发送和接收的聊天系统(这里只实现单向发送,双向同理,定义两个管道即可)。
上一篇关于两个类源码的学习记录:https://www.cnblogs.com/coding-one/p/11351166.html
1. 定义发送者类,PipedSender.java
package com.one.jdksrc.java.io; import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PipedWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner; /**
* @author haoya_Coding_one
* @version 1.0
* @create 2019/7/23 17:59
* @description TODO
*/
public class PipedSender implements Runnable {
private PipedWriter pipedWriter = new PipedWriter();
private String stdInput = "";
Scanner scanner = new Scanner(System.in);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public PipedSender(){
}
@Override
public void run() {
while (!"exit".equalsIgnoreCase(stdInput)){
try {
System.out.print(simpleDateFormat.format(new Date()) + " >>:");
stdInput = scanner.nextLine();
pipedWriter.write(stdInput);
} catch (IOException e) {
System.out.println("发送出错了!");
}
}
try {
pipedWriter.close();
} catch (IOException e) {
System.out.println("关闭流出错了!");
}
} public PipedWriter getPipedWriter() {
return pipedWriter;
} public void setPipedWriter(PipedWriter pipedWriter) {
this.pipedWriter = pipedWriter;
} public void connect(PipedReceiver pipedReceiver){
try {
pipedWriter.connect(pipedReceiver.getPipedReader());
} catch (IOException e) {
e.printStackTrace();
}
} }
PipedSender.java
发送类很简单,使用编译器控制台终端输入,循环监听,接收到 "exit" 时停止监听,关闭流对象。
2. 定义接收者类,PipedReceiver.java
package com.one.jdksrc.java.io; import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PipedReader;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* @author haoya_Coding_one
* @version 1.0
* @create 2019/7/23 18:11
* @description TODO
*/
public class PipedReceiver implements Runnable {
private PipedReader pipedReader = new PipedReader();
private String receiveStr = "";
private char[] buff = new char[1024];
private ReceiverGui receiverGui;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public PipedReceiver(){
receiverGui = new ReceiverGui();
} @Override
public void run() {
int n = 0;
try {
n = pipedReader.read(buff);
receiveStr = new String(buff, 0, n);
} catch (IOException e) {
System.out.println("接收出错了!");
}
while (!"exit".equalsIgnoreCase(receiveStr)){
try {
receiverGui.append(simpleDateFormat.format(new Date()) + " 收到:" + receiveStr);
n = pipedReader.read(buff);
receiveStr = new String(buff, 0, n);
} catch (IOException e) {
System.out.println("接收出错了!");
}
}
receiverGui.append(simpleDateFormat.format(new Date()) + "拜拜");
try {
pipedReader.close();
} catch (IOException e) {
System.out.println("关闭流出错了!");
}
// System.exit(-1);
} public PipedReader getPipedReader() {
return pipedReader;
} public void setPipedReader(PipedReader pipedReader) {
this.pipedReader = pipedReader;
} public static class ReceiverGui extends JFrame {
private JPanel jp=new JPanel();
private JTextArea textArea = new JTextArea();
public ReceiverGui(){
jp.setLayout(null);
textArea.setBounds(20, 20, 500, 500);
textArea.setEditable(false);
jp.add(textArea);
this.add(jp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("my");
this.setResizable(false);
this.setBounds(100, 100, 600, 600);
this.setVisible(true);
} public void append(String string){
this.textArea.append(string);
textArea.append("\n");
}
}
}
PipedReveiver.java
为了清晰地分开发送方和接收方,避免打印混乱,接收类定义了一个简单的内部GUI类用于打印接收到的内容。
3. 主线程测试
上述发送者和接收者都是线程类,在main方法中开启两个线程,就可以实现发送和接收了:
public class PipedTest {
public static void main(String[] args){
PipedSender pipedSender = new PipedSender();
PipedReceiver pipedReceiver = new PipedReceiver();
pipedSender.connect(pipedReceiver);
System.out.println("请开始你们的表演:");
new Thread(pipedSender).start();
new Thread(pipedReceiver).start();
}
}
4. 测试结果
javaIO——PipedReader 和 PipedWriter 实现模拟即时聊天的更多相关文章
- Java-IO之PipedReader和PipedWriter
PipedReader和PipedWriter与PipedInputStream和PipedOutputStream一样,都可以用于管道通信.PipedWriter是字符管道输出流,继承于Writer ...
- [十九]JavaIO之PipedReader 和 PipedWriter
功能简介 还记得PipedInputStream 和 PipedOutputStream么 我们之前是这么说的: p, li { white-space: pre-wrap; } 使用管道通信时,必 ...
- javaIO——PipedReader & PipedWriter
1. 概述: PipedReader 和 PipedWriter,意为管道读写流.所谓管道,那就是有进有出,所以这也是它们跟其它流对象最显著的区别:PipedReader和PipedWriter必须成 ...
- golang从简单的即时聊天来看架构演变
前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...
- 使用PHP+Swoole实现的网页即时聊天工具:PHPWebIM
使用PHP+Swoole实现的网页即时聊天工具 全异步非阻塞Server,可以同时支持数百万TCP连接在线 同时支持websocket+comet2种兼容协议,可用于所有种类的浏览器包括IE 拥有完整 ...
- SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)
SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...
- Node.js + Web Socket 打造即时聊天程序嗨聊
前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...
- 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com smack ...
- 即时聊天IM之二 openfire 整合现有系统用户
合肥程序员群:49313181. 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojit@qq.com 综述: ...
随机推荐
- mac下iterm配色、半透明与样式设置
mac下iterm配色.半透明与样式设置 * {display: table-row!important} .MJXp-surd {vertical-align: top} .MJXp-surd &g ...
- StateListDrawable
可供设置的属性如下: drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态~ state_focused:是否获得焦点 state_window_focused: ...
- 18.flannel
18.flannel docker有四种常用网络 bridge joined opended 直接共享使用节点的网络名称空间 none k8s网络通信: 容器间的通信: 同一个Pod内的多个容器之间通 ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_19-CMS前端页面查询开发-页面原型-Table组件测试
页面填充内容.用一个表格来显示内容 3.1.2.1 Element-UI介绍 本项目使用Element-UI来构建界面,Element是一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面 ...
- 关于react中遇到的问题记录说明
5.el表达式 dataSource = (userPage, orgList) => userPage.map(item => { const org = orgList.find(or ...
- MFC中使用ADO进行数据库操作
参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracl ...
- layui layer.open弹出框获取不了 input框的值
layer.open({ title:'添加管理员', type: 1, content: $('.add_html').html(), btn:['添加', '取消'], btnAlign:'c', ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- PCM-FTL
1. 运行时第一行需要是write 错误位置 trace_stat->sectors += length;
- Java集合框架——Map接口
第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...