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写的非常具体,没有过多的废话,讲的都是重点,仅仅是翻译的中文版看的确实吃力.英文水平太低也没办法,总算也坚持看完了. ...
随机推荐
- Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结
Atitit.常用语言的常用内部api 以及API兼容性对源码级别可移植的重要性 总结 1.1. 要兼容的重要语言api1 1.2. 常用基础api分类 core api1 1.3. 比较常用的扩展库 ...
- CenterOS卸载和安装MYSQL
1.首先在命令行输入mysql,看一下本地计算机上是否有mysql. 2.卸载mysql服务: 首先查看安装的rpm的包:rpm –qa |grep mysql 对之前的服务进行删除.rpm – ...
- random实现验证码功能
直接上代码: #-*- coding: utf-8 -*- #一个简单的验证码程序 import random #定义一个全局变量,初始值为空字符串 checkcode = '' for i in r ...
- Mysql 变量讲解
set语句的学习: 使用select定义用户变量的实践将如下语句改成select的形式: set @VAR=(select sum(amount) from penalties);我的修改: sele ...
- Hibernate一对多映射列表实例(使用xml文件)
如果持久化类具有包含实体引用的列表(List)对象,则需要使用一对多关联来映射列表元素. 在这里,我们使用论坛应用场景,在论坛中一个问题有多个答案. 在这种情况下,一个问题可以有多个答案,每个答案可能 ...
- Spring MVC列表多选框
以下示例显示如何在使用Spring Web MVC框架的表单中使用列表框(Listbox).首先使用Eclipse IDE来创建一个WEB工程,实现一个让用户可选择自己所善长的技术(多选)的功能.并按 ...
- 【转】ATL提供的所有转换宏
在头文件<atlconv.h>中定义了ATL提供的所有转换宏,如: A2CW (LPCSTR) -> (LPCWSTR) A2W (LPCSTR) -> (LPWSTR ...
- Laravel创建模型
laravel中创建模型 <?php /** * Created by PhpStorm. * 新建模型 * User: chuang * Date: 17-1-15 * Time: 上午9:1 ...
- [Unity3D]Unity3D游戏开发之伤害数值显示
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...
- 1119 机器人走方格 V2(组合)
1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于 ...