上一篇学习了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 实现模拟即时聊天的更多相关文章

  1. Java-IO之PipedReader和PipedWriter

    PipedReader和PipedWriter与PipedInputStream和PipedOutputStream一样,都可以用于管道通信.PipedWriter是字符管道输出流,继承于Writer ...

  2. [十九]JavaIO之PipedReader 和 PipedWriter

    功能简介 还记得PipedInputStream  和 PipedOutputStream么 我们之前是这么说的: p, li { white-space: pre-wrap; } 使用管道通信时,必 ...

  3. javaIO——PipedReader & PipedWriter

    1. 概述: PipedReader 和 PipedWriter,意为管道读写流.所谓管道,那就是有进有出,所以这也是它们跟其它流对象最显著的区别:PipedReader和PipedWriter必须成 ...

  4. golang从简单的即时聊天来看架构演变

    前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...

  5. 使用PHP+Swoole实现的网页即时聊天工具:PHPWebIM

    使用PHP+Swoole实现的网页即时聊天工具 全异步非阻塞Server,可以同时支持数百万TCP连接在线 同时支持websocket+comet2种兼容协议,可用于所有种类的浏览器包括IE 拥有完整 ...

  6. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  7. Node.js + Web Socket 打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前 ...

  8. 即时聊天IM之三 XMPP协议客户端库的和Android端框架概述

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com smack ...

  9. 即时聊天IM之二 openfire 整合现有系统用户

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com  综述: ...

随机推荐

  1. 移动端—— 兼容PC端,移动端的点击事件

    移动设备上不支持鼠标事件,好在webkit内核的移动浏览器支持 touch 事件,所以触摸事件是移动应用中所必须的.touchstart.touchmove.touchend事件可以类比于moused ...

  2. vsCode创建自己的代码模板

    (一)新建html快捷键 当我们想在VSCode中新建html代码时,可以 输入! 然后回车或者Tab即可自动生成一个html文件模板,效果如下: 效果如下: 但是有时候我们需要创建一些个性化的,可能 ...

  3. SQL-W3School-基础:SQL DISTINCT 语句

    ylbtech-SQL-W3School-基础:SQL DISTINCT 语句 1.返回顶部 1. 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表 ...

  4. 前端 - 轮询, 长轮训, websocket

    轮询 概念 ajax 轮询的原理很简单,让浏览器间隔几秒就发送一次请求,询问服务器是否有新信息 代码 function showUnreadNews() { $(document).ready(fun ...

  5. Qt编写安防视频监控系统4-删除视频

    一.前言 一般会有两种处理方式来删除视频,一种是鼠标右键菜单,删除当前视频或者删除所有视频,一种是直接按住当前视频,移到视频通道界面以外就表示删除当前视频,这也是个比较人性化的设置,每个人的喜好不一样 ...

  6. [Scikit-learn] 1.1 Generalized Linear Models - Neural network models

    本章涉及到的若干知识点(红字):本章节是作为通往Tensorflow的前奏! 链接:https://www.zhihu.com/question/27823925/answer/38460833 首先 ...

  7. mud那些坑 find_object问题

    find_object  find_object 没有找到对象时  实际上会load_obejct 一次,需要设定一个标记表示 find_obejct 找出来的 对象和需要对比的对象有什么不同 只要n ...

  8. redis管理工具rdm安装;另一个管理工具medis

    安装: brew cask install rdm 开源安装 http://docs.redisdesktop.com/en/latest/install/ 说明 直接从官网下载也可以,不过是收费的 ...

  9. Css3 伪元素

    伪元素---用于向某些选择器设置特殊的效果 语法:元素::伪元素 (element::pseudo-element) 兼容性:IE9+ FireFox4+ Chrome Safari Opera fi ...

  10. SAP HANA2可视化客户端工具

    TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL,MSSQL, Hive,DB2, ...