/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.vicky.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.Socket; import java.util.Vector; /** * * @author Vicky * 广播类 */ public class BManager extends Vector<Socket> { /** * 对所有已经连接上的socket发送消息 * @param msg * @throws IOException */ public synchronized void sendToAll(String msg) throws IOException { Socket socket = null; PrintWriter writer = null; for (int i = 0; i < size(); i++) { socket = get(i); if (socket != null) { writer = new PrintWriter(socket.getOutputStream(),true); if (writer != null) { writer.println(msg); } } } } /** * 向某个人发送消息 * @param msg * @param socket * @throws IOException */ public synchronized void sendToOne(String msg, Socket socket) throws IOException { PrintWriter writer = null; if (socket != null && contains(socket)) { writer = new PrintWriter(socket.getOutputStream(),true); if (writer != null) { writer.println(msg); } } } /** * 向所有人发送当前在线人数 * @throws IOException */ public synchronized void sendInfo() throws IOException { String msg = "当前人数:" + size() + "人"; sendToAll(msg); } } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.vicky.socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Vicky * 聊天系统服务器 */ public class ChatServer { private static final Logger logger = Logger.getLogger(ChatServer.class.getName()); private ServerSocket serverSocket = null; private BManager manager = new BManager(); public ChatServer(int port) { initVar(port); } /** * 初始化服务器 * @param port */ private void initVar(int port) { try { serverSocket = new ServerSocket(port); Socket socket = null; while (serverSocket != null) { socket = serverSocket.accept(); System.out.println("一个用户已经连接上了"); manager.add(socket); Runnable runnable = new SocketThread(socket, manager); if (runnable != null) { Thread thread = new Thread(runnable); thread.start(); } manager.sendInfo(); } } catch (IOException ex) { logger.log(Level.SEVERE, "启动服务器失败!", ex); } } public static void main(String[] args) { ChatServer chatServer = new ChatServer(8888); } } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.vicky.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Vicky * 单个用户Socket线程 */ public class SocketThread implements Runnable { private static final Logger logger = Logger.getLogger(SocketThread.class.getName()); private Socket socket = null; private BManager manager = null; private BufferedReader reader = null; private PrintWriter writer = null; public SocketThread(Socket socket, BManager manager) { this.socket = socket; this.manager = manager; } public void run() { System.out.println("运行已个玩家线程"); try { if (socket != null && manager != null) { reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf8")); writer = new PrintWriter(socket.getOutputStream(), true); // true : autoFlush if (reader != null && writer != null) { String imsg; while ((imsg = reader.readLine()) != null) { if (imsg.equals("exit")) { break; } System.out.println("imsg : " + imsg); manager.sendToAll(imsg); } } } } catch (Exception ex) { } finally { try { manager.remove(socket); if (reader != null) { reader.close(); } if (writer != null) { writer.close(); } if (socket != null) { socket.close(); } reader = null; writer = null; socket = null; System.out.println("客户断开了连接..."); } catch (IOException ex) { } } } } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.vicky.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Vicky * 客户端程序 */ public class ChatClient { private static final Logger logger = Logger.getLogger(ChatClient.class.getName()); private Socket socket = null; private PrintWriter writer = null; private BufferedReader reader = null; public ChatClient(String host, int port) { if (host == null || host.trim().equals("")) { throw new IllegalArgumentException("地址不正确"); } if (port < 1 || port > 9999) { throw new IllegalArgumentException("端口不正确"); } try { socket = new Socket(host, port); } catch (UnknownHostException ex) { logger.log(Level.SEVERE, "找不到该地址", ex); } catch (IOException ex) { logger.log(Level.SEVERE, "创建Socket失败", ex); } if (socket != null) { try { writer = new PrintWriter(socket.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf8")); } catch (IOException ex) { logger.log(Level.SEVERE, "获得输入输出流失败", ex); } } } /** * 向服务器端发送数据 * @param omsg */ public void sendQuest(String omsg) { if (writer != null) { writer.println(omsg); } } } /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package cn.vicky.socket; import java.util.Scanner; /** * 测试 * @author Vicky */ public class Test { public static void main(String[] args) { ChatClient chatClient = new ChatClient("localhost", 8888); while (true) { System.out.println("请输入"); Scanner sc = new Scanner(System.in); String nextLine = sc.nextLine(); if (nextLine != null && !nextLine.trim().equals("")) { System.out.println("向服务器端发送数据 : " + nextLine); chatClient.sendQuest(nextLine); } } } } 这仅仅实现了,JavaSocket的实现!