java网络socket编程(八)之java中BIO实现聊天系统的群聊功能
2016-08-23 09:59
941 查看
代码分为了三部分:客户端代码、服务器端代码、通用类代码
客户端代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; /** * 创建客户端: 发送数据+接收数据 * 写出数据:输出流 * 读取数据:输入流 * 输入流 与输出流 在同一个线程内 应该 独立处理,彼此独立 * @author Administrator */ public class Client { /** * @param args * @throws IOException * @throws UnknownHostException */ public static void main(String[] args) throws UnknownHostException, IOException { System.out.println("请输入名称:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String name = br.readLine(); if(name.equals("")){ return; } Socket client = new Socket("localhost",9999); //发送线程 new Thread(new Send(client,name)).start(); //接收服务器的响应的线程 new Thread(new Receive(client)).start(); } }
服务器代码
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * 创建服务器 * 写出数据:输出流 * 读取数据:输入流 * @author Administrator */ public class Server { private List<MyChannel> all = new ArrayList<MyChannel>(); /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { new Server().start(); } public void start() throws IOException{ ServerSocket server =new ServerSocket(9999); while(true){ Socket client =server.accept(); MyChannel channel = new MyChannel(client); all.add(channel);//统一管理 new Thread(channel).start(); //一条道路 } } /** * 一个客户端 一条道路 * 1、输入流 * 2、输出流 * 3、接收数据 * 4、发送数据 * @author Administrator */ private class MyChannel implements Runnable{ private DataInputStream dis ; private DataOutputStream dos ; private boolean isRunning =true; private String name; public MyChannel(Socket client ) { try { dis = new DataInputStream(client.getInputStream()); dos = new DataOutputStream(client.getOutputStream()); this.name =dis.readUTF(); this.send("欢迎您进入聊天室"); sendOthers(this.name+"进入了聊天室",true); } catch (IOException e) { //e.printStackTrace(); CloseUtil.closeAll(dis,dos); isRunning =false; } } /** * 读取数据 * @return */ private String receive(){ String msg =""; try { msg=dis.readUTF(); } catch (IOException e) { //e.printStackTrace(); CloseUtil.closeAll(dis); isRunning =false; all.remove(this); //移除自身 } return msg; } /** * 发送数据 */ private void send(String msg){ if(null==msg ||msg.equals("")){ return ; } try { dos.writeUTF(msg); dos.flush(); } catch (IOException e) { //e.printStackTrace(); CloseUtil.closeAll(dos); isRunning =false; all.remove(this); //移除自身 } } /** * 发送给其他客户端 */ private void sendOthers(String msg,boolean sys){ //是否为私聊 约定 if(msg.startsWith("@")&& msg.indexOf(":")>-1 ){ //私聊 //获取name String name =msg.substring(1,msg.indexOf(":")); String content = msg.substring(msg.indexOf(":")+1); for(MyChannel other:all){ if(other.name.equals(name)){ other.send(this.name+"对您悄悄地说:"+content); } } }else{ //遍历容器 for(MyChannel other:all){ if(other ==this){ continue; } if(sys){ //系统信息 other.send("系统信息:"+msg); }else{ //发送其他客户端 other.send(this.name+"对所有人说:"+msg); } } } } @Override public void run() { while(isRunning){ sendOthers(receive(),false); } } } }
通用类代码
<strong>1.CloseUtil</strong> import java.io.Closeable; /** * 关闭流的方法 * @author Administrator * */ public class CloseUtil { public static void closeAll(Closeable... io){ for(Closeable temp:io){ try { if (null != temp) { temp.close(); } } catch (Exception e) { // TODO: handle exception } } } }
<strong>2.Receive类</strong> import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; /** * 接收线程 * @author Administrator * */ public class Receive implements Runnable { //输入流 private DataInputStream dis ; //线程标识 private boolean isRunning = true; public Receive() { } public Receive(Socket client){ try { dis = new DataInputStream(client.getInputStream()); } catch (IOException e) { e.printStackTrace(); isRunning =false; CloseUtil.closeAll(dis); } } /** * 接收数据 * @return */ public String receive(){ String msg =""; try { msg=dis.readUTF(); } catch (IOException e) { e.printStackTrace(); isRunning =false; CloseUtil.closeAll(dis); } return msg; } @Override public void run() { //线程体 while(isRunning){ System.out.println(receive()); } } }
<strong>3.Send类</strong> import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; /** * 发送数据 线程 * @author Administrator * */ public class Send implements Runnable{ //控制台输入流 private BufferedReader console; //管道输出流 private DataOutputStream dos; //控制线程 private boolean isRunning =true; //名称 private String name; public Send() { console =new BufferedReader(new InputStreamReader(System.in)); } public Send(Socket client,String name){ this(); try { dos =new DataOutputStream(client.getOutputStream()); this.name =name; send(this.name); } catch (IOException e) { //e.printStackTrace(); isRunning =false; CloseUtil.closeAll(dos,console); } } //1、从控制台接收数据 private String getMsgFromConsole(){ try { return console.readLine(); } catch (IOException e) { //e.printStackTrace(); } return ""; } /** * 1、从控制台接收数据 * 2、发送数据 */ public void send(String msg){ try { if(null!=msg&& !msg.equals("")){ dos.writeUTF(msg); dos.flush(); //强制刷新 } } catch (IOException e) { //e.printStackTrace(); isRunning =false; CloseUtil.closeAll(dos,console); } } @Override public void run() { //线程体 while(isRunning){ send(getMsgFromConsole()); } } }
相关文章推荐
- java网络socket编程(七)之java中NIO实现聊天系统的群聊功能
- 一个java网络编程Socket的例子,实现Server与Client聊天
- java多线程以及java网络编程实现简单的聊天系统
- java网络编程一:模拟qq聊天功能,实现一对一聊天
- 基于Socket的java网络编程(实现类似于QQ两人聊天的交互)
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—开桌功能))
- 【Java Socket】【Flex Socket】【Java 多线程】实现基本聊天功能demo
- java网络编程一:Socket用法,简单模拟一对一聊天
- java网络编程实现一个聊天程序
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—结算功能(中部))
- socket 编程 TCP 实现简单聊天功能
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—结算功能(下部))
- Android网络编程之一个Android下菜单系统模块的实现(客户端—添单功能(上部))
- Java网络编程二:Java Secure(SSL/TLS) Socket实现
- java 聊天程序 socket网络编程
- Java 用Socket实现的多人聊天系统
- Android网络编程之一个Android下菜单系统模块的实现(客户端—开桌功能(上部))
- Java网络编程——使用NIO实现非阻塞Socket通信
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—添单功能)
- Java_乔晓松_Java网络编程UDP实现黑窗口聊天