实现信息共享:在Socket上的实时交流
2007-06-08 17:32
239 查看
实现信息共享:在Socket上的实时交流
网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。下面看看如何开发一个可以实时传递消息的程序。
设计原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
{源码}
这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。
网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。下面看看如何开发一个可以实时传递消息的程序。
设计原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
{源码}
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ArrayList Threader = new ArrayList(); private static LinkedList Message_Array = new LinkedList(); private static int Thread_Counter = 0; private static boolean isClear = true; protected static final int SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true); public Server() throws FileNotFoundException, IOException { super(SERVER_PORT); new Broadcast(); //append connection log Calendar now = Calendar.getInstance(); String str = "[" + now.getTime().toString() + "] Accepted a connection/015/012"; byte[] tmp = str.getBytes(); LOG_FILE.write(tmp); try { while (true) { Socket socket = accept(); new CreateServerThread(socket); } } finally { close(); } } public static void main(String[] args) throws IOException { new Server(); } //--- Broadcast class Broadcast extends Thread { public Broadcast() { start(); } public void run() { while (true) { if (!isClear) { String tmp = (String)Message_Array.getFirst(); for (int i = 0; i < Threader.size(); i++) { CreateServerThread client = (CreateServerThread)Threader.get(i); client.sendMessage(tmp); } Message_Array.removeFirst(); isClear = Message_Array.size() > 0 ? false : true; } } } } //--- CreateServerThread class CreateServerThread extends Thread { private Socket client; private BufferedReader in; private PrintWriter out; private String Username; public CreateServerThread(Socket s) throws IOException { client = s; in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(), true); out.println("--- Welcome to this chatroom ---"); out.println("Input your nickname:"); start(); } public void sendMessage(String msg) { out.println(msg); } public void run() { try { int flag = 0; Thread_Counter++; String line = in.readLine(); while (!line.equals("bye")) { if (line.equals("l")) { out.println(listOnlineUsers()); line = in.readLine(); continue; } if (flag++ == 0) { Username = line; User_List.add(Username); out.println(listOnlineUsers()); Threader.add(this); pushMessage("[< " + Username + " come on in >]"); } else { pushMessage("<" + Username + ">" + line); } line = in.readLine(); } out.println("--- See you, bye! ---"); client.close(); } catch (IOException e) {} finally { try { client.close(); } catch (IOException e) {} Thread_Counter--; Threader.remove(this); User_List.remove(Username); pushMessage("[< " + Username + " left>]"); } } private String listOnlineUsers() { String s ="-+- Online list -+-/015/012"; for (int i = 0; i < User_List.size(); i++) { s += "[" + User_List.get(i) + "]/015/012"; } s += "-+---------------------+-"; return s; } private void pushMessage(String msg) { Message_Array.addLast(msg); isClear = false; } } } |
相关文章推荐
- 实现信息共享:在Socket上的实时交流
- netty-socketio实时推送信息
- linux和开发板实现信息共享
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
- spring + rabbitmq + websocket实现实时通知
- Java用WebSocket + tail命令实现Web实时日志
- 有了她还要需要导航仪么?-发动群众的力量共享交通信息和绘制实时地图的Waze
- 求助!用openlayers如何实现读入数据库的地理位置信息,然后进行实时同步定位??万分感谢!
- WebSocket+多线程python socket网页版实时在线聊天实现
- 在 Linux 上实现基于 Socket 的多进程实时通信
- php socket实现http请求,读取服务器信息
- [置顶] Android中高仿快牙实现Socket列表的展示,获取安卓手机系统安装的应用和自己安装的应用相关信息
- 利用Socket.io 实现消息实时推送功能
- Android实现fragment向Activity实时传递信息
- win7下利用iis搭建web服务器实现信息浏览资源共享
- jsp简单实现页面之间共享信息的方法
- Android 基于Socket的长连接实现一个实时推送的功能
- 《ERP从内部集成起步》读书笔记——第2章 从优化业务流程谈信息集成的必要性 2.2信息集成与实时共享2.2.2信息集成与实时共享
- 共享一个获取本地信息IP,MAC的头文件及其实现方法(更新)
- android使用socket实现实时视频