最近在复习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. 影子寄存器(shadow register)

    1.以下仅供参考:有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的.但在操作中真正 ...

  2. UVA 11014 - Make a Crystal(容斥原理)

    UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, ...

  3. 内核交互--sysfs

    文档介绍:http://lxr.linux.no/linux+v2.6.37/Documentation/filesystems/sysfs.txt The sysfs Filesystem Sysf ...

  4. 2038: [2009国家集训队]小Z的袜子(hose) 分块

    : [2009国家集训队]小Z的袜子(hose) Time Limit: Sec Memory Limit: MB Submit: Solved: [Submit][Status][Discuss] ...

  5. 使用Squid搭建HTTPS代理服务器

    由于经常去的一些国外网站如Google.Blogspot.Wordpress被"出现了技术问题",访问不了,于是我在自己的DigitalOcean云主机上搭建了一个 Squid代理 ...

  6. 为什么Servlet修改之后,Tomcat都得重启,servlet才会生效!

    最近做东西经常需要重新加载项目,今天深深的问了自己为什么? Servlet的生命周期中,只会初始化一次,如果每次要是发送请求或响应,Servlet引擎都会调用service.从这里就会看出,servl ...

  7. JavaScript 代码块

    JavaScript 语句通过代码块的形式进行组合. 块由左花括号开始,由右花括号结束. 块的作用是使语句序列一起执行. JavaScript 函数是将语句组合在块中的典型例子. 下面的例子将运行可操 ...

  8. python 案例:使用BeautifuSoup4的爬虫

    我们以腾讯社招页面来做演示:http://hr.tencent.com/position.php?&start=10#a 使用BeautifuSoup4解析器,将招聘网页上的职位名称.职位类别 ...

  9. c++中sin,cos,arcsin等和在C/C++中使用pi (π) 值

    先 #include<math.h> 反3角函数有 acos(double),asin(double),atan(double),atan(double,double),返回值 doubl ...

  10. div块级元素获取焦点

    在做弹出层时需要对div获取失去焦点 focus blur只是针对form表单控件的,而对于 span , div , li 之类的,则没办法触发它们的动作 几个事件(摘自w3c). blur事件: ...