最近在复习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. ubuntu 新建一个root用户

    1. 新建一个终端(Applications menu -> Accessories -> Terminal), 输入: sudo –s sudo passwd 输入要设置的密码,这样以后 ...

  2. C++语言基础(9)-继承

    一.继承的基本语法 #include<iostream> using namespace std; //基类 Pelple class People{ public: void setna ...

  3. 61. Search for a Range【medium】

    61. Search for a Range[medium] Given a sorted array of n integers, find the starting and ending posi ...

  4. >/dev/null 2>&1的作用

    1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"  2 表示stderr标准错误  &am ...

  5. if not aa 表示如果aa等于空就是true 相当于if not aa 相当于 if aa== 空

    aa='tt' print(not aa) #表示 bb是空的 not 表示空 bb='' print(not bb)

  6. JDBC mysql 中文乱码

    中文乱码似乎是程序编写中永恒的一个话题和难点,就比如MySQL存取中文乱码,但我想做任何事情,都要有个思路才行,有了思路才知道如何去解决问题,否则,即使一时解决了问题,但过后不久又碰到同样的问题可能又 ...

  7. VLC WebPlugin中文

    Documentation:WebPlugin 这篇文档讲述的是 VLC media player Web plugins 和怎样在网页使用它 Contents 1 介绍: 构建包含video的Web ...

  8. TP find() 查找

    如果用了find()进行查找数据.那么那么获取到这条对象的则是用find查找出的这条对象. 如果: $obj=$this->where('id'=>$id)->find(); 那么可 ...

  9. windows下mysql区分大小写敏感问题

    默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不是这样.以下语句在Unix上不起作用,因为它引用别名as a和as A: mysql> SELECT col_name ...

  10. 嵌入式开发之davinci--- 8148/8168/8127 中swms、Mosaic’s、display 显示pal 模式

    (1) (2) (3) (4) -------------------------author:pkf ------------------------------time:2-3 --------- ...