客户端
package chatroom_singal; import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import java.util.Map; import java.util.Scanner; //客户端 class OutToServer2 implements Runnable{ private Socket client; public OutToServer2(Socket client) { super(); this.client = client; } @Override public void run() { PrintStream printStream; try { printStream = new PrintStream(client.getOutputStream(),true); Scanner scanner = new Scanner(System.in); scanner.useDelimiter("\n"); while(true) { System.out.println("请输入:"); while(scanner.hasNext()) { String string = scanner.nextLine(); printStream.println(string); if(string.equals("拜拜")) { System.out.println("客户端退出"); printStream.close(); scanner.close(); //client.close(); break; } } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class ReadFromServer2 implements Runnable{ private Socket client; public ReadFromServer2(Socket client) { super(); this.client = client; } public void run() { try { Scanner scanner = new Scanner(client.getInputStream()); scanner.useDelimiter("\n"); while(scanner.hasNext()) { System.out.println("服务器端输入:"+scanner.nextLine()); } } catch (IOException e) { e.printStackTrace(); } } } public class GroupClient { public static void main(String[] args) { String serverName = "127.0.0.1"; int port = 6666; Socket client; try { client = new Socket(serverName,port); Thread ouThread = new Thread(new OutToServer2(client)); Thread inThread = new Thread(new ReadFromServer2(client)); ouThread.start(); inThread.start(); } catch (Exception e) { e.printStackTrace(); } } }
服务端
package chatroom_singal; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.text.html.HTMLDocument.Iterator; //服务端 class ExcuteClientServer1 implements Runnable { private Socket client; private Map<String, Socket> clientMap; public ExcuteClientServer1(Socket client,Map<String, Socket> clientMap) { // TODO Auto-generated constructor stub super(); this.client = client; this.clientMap = clientMap; } @Override public void run() { // TODO Auto-generated method stub //拿到客户输入流,读取用信息 try { Scanner scanner = new Scanner(client.getInputStream()); String string = null; while(true) { if(scanner.hasNext()) { string = scanner.nextLine(); Pattern pattern = Pattern.compile("\r\n|\r\n"); Matcher matcher = pattern.matcher(string); string = matcher.replaceAll(""); //用户注册 if(string.startsWith("userName")) { String userName = string.split("\\:")[1]; userRegist(userName,client); continue; } //群聊 else if (string.startsWith("G")) { String message = string.split("\\:")[1]; gropChat(message); continue; } //私聊 else if (string.startsWith("P")) { String temp = string.split("\\:")[1]; //取得用户名 String userName = temp.split("\\-")[0]; //取得消息内容 String message = temp.split("\\-")[1]; privateChat(userName,message); continue; } //用户退出 //此时有 Socket,需要找出对应的key else if (string.contains("bye")) { //先根据Socket知道用户名 String userName = getUseName(client); System.out.println("用户"+userName+"下线了。。。"); System.out.println("当前在线人数为"+clientMap.size()); clientMap.remove(userName); continue; } } } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //获取Key值,即由端口号找到用户名 private String getUseName(Socket socket) { // TODO Auto-generated method stub String useName = null; for(String getKey : clientMap.keySet()) { if(clientMap.get(getKey).equals(socket)) { useName = getKey; } } return useName; } //私聊 private void privateChat(String useName, String message) { // TODO Auto-generated method stub //根据对应的useName找到对应的Socket Socket privateSocket = clientMap.get(useName); try { PrintStream printStream = new PrintStream(privateSocket.getOutputStream()); printStream.println("用户名为"+getUseName(client)+"的用户对你说:"+message); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //群聊 private void gropChat(String message) { // TODO Auto-generated method stub java.util.Iterator<Entry<String,Socket>> iterable = clientMap.entrySet().iterator(); for(Map.Entry<String, Socket> stringSocketEntry:clientMap.entrySet()) { try { Socket socket = stringSocketEntry.getValue(); PrintStream printStream = new PrintStream(socket.getOutputStream(),true); System.out.println("用户说"+message); printStream.println(message); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //注册 private void userRegist(String userName, Socket client) { // TODO Auto-generated method stub System.out.println("用户名为:"+userName); System.out.println("用户Socket为:"+client); System.out.println("用户名为"+userName+"上线了!!!"); System.out.println("当前用户为"+(clientMap.size()+1)+"人"); clientMap.put(userName, client); } } public class GroupServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(6666); //存取用户信息(用户名和Socket) Map<String, Socket> map = new HashMap<String, Socket>(); //线程池,线程大小为20 ExecutorService executorService =Executors.newFixedThreadPool(20); System.out.println("等待客户连接中..."); try { for(int i = 0;i < 20;i ++) { Socket socket = serverSocket.accept(); System.out.println("有新的用户连接:"+socket.getInetAddress()+socket.getPort()); executorService.execute(new ExcuteClientServer1(socket,map)); } executorService.shutdown(); serverSocket.close(); } catch (Exception e) { } } }