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 综述: ...
随机推荐
- django 后台静态文件不显示
原文链接 https://my.oschina.net/VASKS/blog/874270 django admin svg 不显示.后台显示 xx.svg 200 但浏览器就是不显示. 百度了一圈, ...
- java 测试框架 TestNG
Java中print.printf.println的区别 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和prin ...
- [服务器时区问题]PHP Warning: strftime(): It is not safe to rely on the system's timezone set
PHP Warning: strftime(): It is not safe to rely on the system's timezone set 当运行一些程序时,在httpd日志中会有如下警 ...
- 浅析 Nodejs 模块化
本文只讨论 CommonJS 规范,不涉及 ESM 我们知道 JavaScript 这门语言诞生之初主要是为了完成网页上表单的一些规则校验以及动画制作,所以布兰登.艾奇(Brendan Eich)只花 ...
- python3 高级编程(三) 使用@property
@property装饰器就是负责把一个方法变成属性调用的. @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性 cl ...
- Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...
- python 内置数据结构 切片
切片 通过索引区间访问线性结构的一段数据 sequence[start:stop] 表示返回[start,stop]区间的子序列 支持负索引 start为0,可以省略 stop为末尾,可以省略 超过上 ...
- nginx和php-fpm 是使用 tcp socket 还是 unix socket ?
转自 http://blog.csdn.net/qq624202120/article/details/60957634 从上面的图片可以看,unix socket减少了不必要的tcp开销,而tcp需 ...
- python下载一些包出现time out的问题解决
更换镜像点: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package 将package换成自己要下载的包即可 亲测还挺快的
- useJDBC4ColumnNameAndLabelSemantics设置后无效,怎么办?
连接的是DB2数据库, 在查询语句中有SELECT COLUMNNAME AS ALIASNAME FROM TABLE这样的结构时, 会报如下错误: Caused by: com.ibm.db2.j ...