java bio 之聊天室
最近在复习java io相关知识 ,发现很多细节之前没学习到位,原理也没吃透,只能感叹本人愚钝。
复习到bio,顺手写了个简单的聊天室功能,并和大家分享下。
服务端:
package io.QQ聊天室实现_BIO; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List; public class ChartServer {
public static void main (String[] args) throws IOException {
ChartServer server = new ChartServer();
server.init(8889).listener();
}
private ServerSocket serverSocket;
private final List<ProcessorThread> clients = new ArrayList<>();
public ChartServer init(int port) throws IOException {
this.serverSocket =new ServerSocket(port);
return this;
}
public void listener() throws IOException {
//主线程负责监听,启动监听线程
System.out.println("listener start");
new Thread(new AcceptThread(serverSocket)).start();
} class AcceptThread implements Runnable{
private ServerSocket serverSocket; public AcceptThread (ServerSocket serverSocket) {
this.serverSocket = serverSocket;
} @Override
public void run () {
while (true){
try {
Socket socket = serverSocket.accept();
//子线程负责分发任务
new Thread(new ProcessorThread(socket)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} class ProcessorThread implements Runnable{
Socket socket; public ProcessorThread (Socket socket) {
this.socket = socket;
} @Override
public void run () {
String key = "["+socket.getInetAddress().getHostAddress()+":"+socket.getPort()+"]";
System.out.println(key+"上线了");
try {
writeMsg(socket,key+"上线了");
clients.add(this);
readMsg(socket,key);
} catch (IOException e) {
e.printStackTrace();
}
} public String readMsg(Socket socket,String name) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readLine;
while (true){
readLine = br.readLine();
System.out.println(name+"说:"+readLine);
writeMsg(socket,name+"说:"+readLine);
}
} public void writeMsg(Socket socket,String msg) throws IOException {
//轮询
OutputStream os;
for(ProcessorThread s:clients){
os = s.socket.getOutputStream();
os.write(msg.getBytes());
os.write("\n".getBytes());
os.flush();
}
}
}
}
客户端:
package io.QQ聊天室实现_BIO; import java.io.*;
import java.net.Socket;
import java.util.Scanner; public class ChartClient { private Socket socket; public void init(String host,int port) throws IOException { Scanner scanner = new Scanner(System.in);
socket = new Socket(host,port);
new Thread(new readThread(socket)).start();
while (scanner.hasNextLine()){
String inputStr = scanner.nextLine();
OutputStream os = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
osw.write(inputStr);
osw.write("\n");
osw.flush();
}
} class readThread implements Runnable{ Socket socket; InputStream answer ;
public readThread (Socket socket) throws IOException {
this.socket = socket;
answer = socket.getInputStream();
} @Override
public void run () {
while (true){
BufferedReader br = new BufferedReader(new InputStreamReader(answer));
try {
StringBuffer sb = new StringBuffer();
String readLine;
while (true){
readLine = br.readLine();
sb.append(readLine);
System.out.println(readLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} static String host = "127.0.0.1";
static int port = 8889;
public static void main (String[] args) throws IOException {
ChartClient chartClient = new ChartClient();
chartClient.init(host,port);
} }
总结:
在本例中,最重要的是要理解socket.accept()方法是阻塞的。bio中提供的流写入读取是阻塞的,如inputStream.read 是阻塞的。BufferedReader.readline()的结束标志。
在java网络编程或者java多线程编程中,线程分工是很重要的思想,可以参照tomcat等成熟容器的设计学习。
java bio 之聊天室的更多相关文章
- Java实现简易聊天室
Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...
- java多线程控制台聊天室(转)
用java多线程实现一个控制台聊天室,呵呵,好玩! 聊天室服务器端 package tf.thread; import java.io.BufferedReader; import java.io.I ...
- 基于Java的在线聊天室
概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...
- [Java小程序]聊天室——Socket和ServerSocket的使用
这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...
- Java多人聊天室第一版
package cn.zhang.chat; import java.io.BufferedReader; import java.io.PrintWriter; /** * 所有用户均有的信息,单独 ...
- [置顶]
Chat Room:基于JAVA Socket的聊天室设计
d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...
- 哟哟哟,JAVA组装的聊天室,最简单的实现
太码多码码,总是多些感觉~~~ 打了快一个小时啊, 但看着一行一行的出来, 还是有成就感的~~:) VerySimpleChatServer.java import java.io.*; import ...
- Java Socket 多线程聊天室
本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获 ...
- Java NIO实战之聊天室
在工作之余花了两个星期看完了<Java NIO>.整体来说这本书把NIO写的非常具体,没有过多的废话,讲的都是重点,仅仅是翻译的中文版看的确实吃力.英文水平太低也没办法,总算也坚持看完了. ...
随机推荐
- linux文件系统调用(1)---mount
术语表: struct mount:挂载点 struct mountpoint:挂载点节点 struct vfsmount:挂载项 源文件系统:用户将要挂载的文件系统 目的文件系统:挂载源文件系统的文 ...
- Atitit。sql2016标准化的规划方案 v3 q2a
Atitit.sql2016标准化的规划方案 v3 q2a 1. Sql标准化的历史3 1.1. Sql92标准4 1.2. Sql99标准4 1.3. SQL:2003为例,它包括以下9个部分 5 ...
- 关于angularjs在IE里的坑——F12工具打开,功能正常,关闭之后,angularjs not working
前端时间在做项目的时候,用到了angularjs,期间,发现了一个奇葩的问题,就是在IE11浏览器下,点击下方图1上箭头所示的位置,将此处的开关变为图2中箭头所示的样子,但是发觉没有反应,开关还是灰色 ...
- pthread_cleanup_push和pthread_cleanup_pop清除函数是否执行的说明
示例1: #include <stdio.h> #include <pthread.h> void* clean(void* arg) { printf("clean ...
- Python内置函数之any()
any()函数和all()函数相对立. 相同点为: any()也只能传入一个参数. any()的参数必须是可迭代对象. 不同点: 可迭代对象中只要有一个元素为True,返回值就是True. 下面看看具 ...
- 浅谈一致性hash
相信做过互联网应用的都知道,如何很好的做到横向扩展,其实是个蛮难的话题,缓存可横向扩展,如果采用简单的取模,余数方式的部署,基本是无法做到后期的扩展的,数据迁移及分布都是问题,举个例子: 假设采用取模 ...
- objc_runtime使用方法的几个简单例子(转)
1. 给NSObject类动态添加属性h定义部分 [cpp] @interface UIWebView (LoadProgress) @property (nonatomic, assign) NS ...
- ext2文件系统了解
一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下以ext2文件系统为例说明文件 ...
- Android DRM
最近在了解Android DRM相关的一些知识,下面转一个ARM大佬分享的内容: 前言 本文简略地介绍了如何在Android下实现DRM(Digital Rights Management, 数字版权 ...
- 图谱论(Spectral Graph Theory)基础
拉普拉斯矩阵(Laplacian matrix),也称为导纳矩阵(Admittance matrix)或者基尔霍夫矩阵(Kirchohoff matrix) 归一化的拉普拉斯矩阵定义为 例子: 拉普拉 ...