最近在复习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 之聊天室的更多相关文章

  1. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  2. java多线程控制台聊天室(转)

    用java多线程实现一个控制台聊天室,呵呵,好玩! 聊天室服务器端 package tf.thread; import java.io.BufferedReader; import java.io.I ...

  3. 基于Java的在线聊天室

    概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...

  4. [Java小程序]聊天室——Socket和ServerSocket的使用

    这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...

  5. Java多人聊天室第一版

    package cn.zhang.chat; import java.io.BufferedReader; import java.io.PrintWriter; /** * 所有用户均有的信息,单独 ...

  6. [置顶] Chat Room:基于JAVA Socket的聊天室设计

    d0304 更新功能实现 d0312 更新部分图片&UI设计部分 d0318 更新功能实现 d1222 实现添加好友功能.实现注册功能.修改大量BUG github:https://githu ...

  7. 哟哟哟,JAVA组装的聊天室,最简单的实现

    太码多码码,总是多些感觉~~~ 打了快一个小时啊, 但看着一行一行的出来, 还是有成就感的~~:) VerySimpleChatServer.java import java.io.*; import ...

  8. Java Socket 多线程聊天室

    本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获 ...

  9. Java NIO实战之聊天室

    在工作之余花了两个星期看完了<Java NIO>.整体来说这本书把NIO写的非常具体,没有过多的废话,讲的都是重点,仅仅是翻译的中文版看的确实吃力.英文水平太低也没办法,总算也坚持看完了. ...

随机推荐

  1. Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决

    在使用异步载入框架Android-Universal-Image-Loader的Jar包的时候遇到错误: java.lang.NoClassDefFoundError:com.nostra13.uni ...

  2. ipk CONTROL 目录的作用

    CONTROL文件夹下的文件意义preinst        - shell script,在ipk包开始安装前执行;postinst       - shell script,在ipk包安装后执行; ...

  3. Swift 烧脑体操一

    Swift 烧脑体操(一) - Optional 的嵌套   前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融 ...

  4. Java 十进制和十六制之间的转化(负数的处理)

    原文: http://www.cnblogs.com/literoad/archive/2013/01/25/2875908.html 在一些情况下,我们需要将数字在十进制和十六制下互相转化. 在Ja ...

  5. out传值

    public void Out(out int a, out int b)        {//out相当于return返回值            //可以返回多个值            //拿过 ...

  6. iOS敏捷开发之道,经常使用的宏定义总结

    iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...

  7. 搭建RocketMQ踩的坑-内存不足

    环境是vmvare+ubuntu 1.http://rocketmq.apache.org/docs/quick-start/ 按照官网来启动mqnamesrv和mqbroker报错 错误如下 The ...

  8. TLS,SSL,HTTPS with Python(转)

    From: 扫盲 HTTPS 和 SSL/TLS 协议[0]:引子 需要了解的背景知识: 术语 HTTPS,SSL,TLS 长连接与短连接的关系 了解 CA 证书 基本流程 一.术语扫盲 1.什么是S ...

  9. git branch merge到master

    使用merge可以合并多个历史记录的流程. 如下图所示,bugfix分支是从master分支分叉出来的. 合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合 ...

  10. linux oracle配置开机启动

    参考:http://jingyan.baidu.com/article/b2c186c8fe4306c46ef6ff16.html 先以root身份登录到linux系统, 1. 修改vi /etc/o ...