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 综述: ...
随机推荐
- 移动端—— 兼容PC端,移动端的点击事件
移动设备上不支持鼠标事件,好在webkit内核的移动浏览器支持 touch 事件,所以触摸事件是移动应用中所必须的.touchstart.touchmove.touchend事件可以类比于moused ...
- vsCode创建自己的代码模板
(一)新建html快捷键 当我们想在VSCode中新建html代码时,可以 输入! 然后回车或者Tab即可自动生成一个html文件模板,效果如下: 效果如下: 但是有时候我们需要创建一些个性化的,可能 ...
- SQL-W3School-基础:SQL DISTINCT 语句
ylbtech-SQL-W3School-基础:SQL DISTINCT 语句 1.返回顶部 1. 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表 ...
- 前端 - 轮询, 长轮训, websocket
轮询 概念 ajax 轮询的原理很简单,让浏览器间隔几秒就发送一次请求,询问服务器是否有新信息 代码 function showUnreadNews() { $(document).ready(fun ...
- Qt编写安防视频监控系统4-删除视频
一.前言 一般会有两种处理方式来删除视频,一种是鼠标右键菜单,删除当前视频或者删除所有视频,一种是直接按住当前视频,移到视频通道界面以外就表示删除当前视频,这也是个比较人性化的设置,每个人的喜好不一样 ...
- [Scikit-learn] 1.1 Generalized Linear Models - Neural network models
本章涉及到的若干知识点(红字):本章节是作为通往Tensorflow的前奏! 链接:https://www.zhihu.com/question/27823925/answer/38460833 首先 ...
- mud那些坑 find_object问题
find_object find_object 没有找到对象时 实际上会load_obejct 一次,需要设定一个标记表示 find_obejct 找出来的 对象和需要对比的对象有什么不同 只要n ...
- redis管理工具rdm安装;另一个管理工具medis
安装: brew cask install rdm 开源安装 http://docs.redisdesktop.com/en/latest/install/ 说明 直接从官网下载也可以,不过是收费的 ...
- Css3 伪元素
伪元素---用于向某些选择器设置特殊的效果 语法:元素::伪元素 (element::pseudo-element) 兼容性:IE9+ FireFox4+ Chrome Safari Opera fi ...
- SAP HANA2可视化客户端工具
TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL,MSSQL, Hive,DB2, ...