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 综述: ...
随机推荐
- Swift 可选链
可选链(Optional Chaining)是一种可以请求和调用属性.方法和子脚本的过程,用于请求或调用的目标可能为nil. 可选链返回两个值: 如果目标有值,调用就会成功,返回该值 如果目标为nil ...
- js常用正则(2)
res(a, b, str) { //数字加英文 let re = `\^\\w{${a},${b}}\$` let reg = new RegExp(re); let status = !reg.t ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_17-CMS前端工程创建-单页面应用介绍
查看运行起来的页面的源代码 这个webpck打包生成的文件. 单页面应用的优缺点: 优点: 1.用户操作体验好,用户不用刷新页面,整个交互过程都是通过Ajax来操作. 2.适合前后端分离开发,服务端提 ...
- Qt编写自定义控件22-蚂蚁线
一.前言 关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴 ...
- 一百三十五:CMS系统之UEditoe编辑器集成以及配置将图片上传到七牛
富文本编辑框,选择UEditor 下载地址:http://ueditor.baidu.com/website/download.html 使用说明:http://fex.baidu.com/uedit ...
- 一百三十一:CMS系统之轮播图上传图片功能
将七牛js放到common下 把获取uptoken的接口放到common视图中 把初始化七牛放到banners.js中 //初始化七牛$(function () { qiniujs.setUp({ ' ...
- php自定义错误处理函数
function myErrorHandler($errno, $errstr, $errfile, $errline) { echo "<b>Custom error:< ...
- 编写expect程序报extra characters after close-brace错误或extra characters after close-quote,解决
expect程序报extra characters after close-brace或extra characters after close-quote 可能原因 流程控制语句中的"{& ...
- 简单记录一下虚拟机中安装Linux的流程以及部分软件的安装命令
一,虚拟机使用的是VMware9 ,linux使用的是服务器中用的比较多的CentOS6.4.稍后我会把这两个版本放到网盘中,需要的朋友可以去下载: 网盘地址: 二,VM的安装比较简单,基本上按照网上 ...
- linux中alarm函数和pause函数详解实例
alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个slee ...