国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java GUI編程——在線聊天室

2019-11-06 07:19:26
字體:
來源:轉載
供稿:網友

引言

綜合應用java的GUI編程和網絡編程,實現一個能夠支持多組用戶同時使用的聊天室軟件。該聊天室具有比較友好的GUI界面,并使用C/S模式,支持多個用戶同時使用,用戶可以自己選擇加入或者創建房間,和房間內的其他用戶互發信息(文字和圖片)

主要功能

客戶端的功能主要包括如下的功能:

選擇連上服務端顯示當前房間列表(包括房間號和房間名稱)選擇房間進入多個用戶在線群聊可以發送表情(用本地的,實際上發送只發送表情的代碼)退出房間選擇創建房間房間里沒人(房主退出),導致房間解散顯示系統提示消息顯示用戶消息構造標準的消息結構發送維護GUI所需的數據模型

服務端的功能主要包括:

維護用戶信息和房間信息處理用戶發送來的消息選擇轉發或者回復處理結果構造標準的消息結構發送

架構

整個程序采用C/S設計架構,分為一個服務端和多個客戶端。服務端開放一個端口給所有開客戶端,客戶端連接該端口并收發信息,服務端在內部維護客戶端的組,并對每一個客戶端都用一個子線程來收發信息

基本類的設計

 User類

package User;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PRintWriter;import java.net.Socket;/** * * @author lannooo * */public class User { private String name; private long id; private long roomId; private Socket socket; private BufferedReader br; private PrintWriter pw; /** * * @param name: 設置user的姓名 * @param id:設置user的id * @param socket:保存用戶連接的socket * @throws IOException */ public User(String name, long id, final Socket socket) throws IOException { this.name=name; this.id=id; this.socket=socket; this.br=new BufferedReader(new InputStreamReader( socket.getInputStream())); this.pw=new PrintWriter(socket.getOutputStream()); } /** * 獲得該用戶的id * @return id */ public long getId() { return id; } /** * 設置該用戶的id * @param id 新的id */ public void setId(long id) { this.id = id; } /** * 獲得用戶當前所在的房間號 * @return roomId */ public long getRoomId() { return roomId; } /** * 設置當前用戶的所在的房間號 * @param roomId */ public void setRoomId(long roomId) { this.roomId = roomId; } /** * 設置當前用戶在聊天室中的昵稱 * @param name */ public void setName(String name) { this.name = name; } /** * 返回當前用戶在房間中的昵稱 * @return */ public String getName() { return name; } /** * 返回當前用戶連接的socket實例 * @return */ public Socket getSocket() { return socket; } /** * 設置當前用戶連接的socket * @param socket */ public void setSocket(Socket socket) { this.socket = socket; } /** * 獲得該用戶的消息讀取輔助類BufferedReader實例 * @return */ public BufferedReader getBr() { return br; } /** * 設置 用戶的消息讀取輔助類 * @param br */ public void setBr(BufferedReader br) { this.br = br; } /** * 獲得消息寫入類實例 * @return */ public PrintWriter getPw() { return pw; } /** * 設置消息寫入類實例 * @param pw */ public void setPw(PrintWriter pw) { this.pw = pw; } /** * 重寫了用戶類打印的函數 */ @Override public String toString() { return "#User"+id+"#"+name+"[#Room"+roomId+"#]<socket:"+socket+">"; }}

Room類

package Room;import java.util.ArrayList;import java.util.List;import User.User;/** * * @author lannooo * */public class Room { private String name; private long roomId; private ArrayList<User> list; private int totalUsers; /** * 獲得房間的名字 * @return name */ public String getName() { return name; } /** * 設置房間的新名字 * @param name */ public void setName(String name) { this.name = name; } /** * 獲得房間的id號 * @return */ public long getRoomId() { return roomId; } /** * 設置房間的id * @param roomId */ public void setRoomId(long roomId) { this.roomId = roomId; } /** * 向房間中加入一個新用戶 * @param user */ public void addUser(User user) { if(!list.contains(user)){ list.add(user); totalUsers++; }else{ System.out.println("User is already in Room<"+name+">:"+user); } } /** * 從房間中刪除一個用戶 * @param user * @return 目前該房間中的總用戶數目 */ public int delUser(User user){ if(list.contains(user)){ list.remove(user); return --totalUsers; }else{ System.out.println("User is not in Room<"+name+">:"+user); return totalUsers; } } /** * 獲得當前房間的用戶列表 * @return */ public ArrayList<User> getUsers(){ return list; } /** * 獲得當前房間的用戶昵稱的列表 * @return */ public String[] getUserNames(){ String[] userList = new String[list.size()]; int i=0; for(User each: list){ userList[i++]=each.getName(); } return userList; } /** * 使用房間的名稱和id來new一個房間 * @param name * @param roomId */ public Room(String name, long roomId) { this.name=name; this.roomId=roomId; this.totalUsers=0; list = new ArrayList<>(); }}

RoomList類

package Room;import java.awt.image.DirectColorModel;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import User.User;/** * * @author lannooo * */public class RoomList { private HashMap<Long, Room> map; private long unusedRoomId; public static long MAX_ROOMS = 9999; private int totalRooms; /** * 未使用的roomid從1算起,起始的房間總數為0 */ public RoomList(){ map = new HashMap<>(); unusedRoomId = 1; totalRooms = 0; } /** * 創建一個新的房間,使用未使用的房間號進行創建,如果沒有可以使用的則就創建失敗 * @param name: 房間的名字 * @return 創建的房間的id */ public long createRoom(String name){ if(totalRooms<MAX_ROOMS){ if(name.length()==0){ name = ""+unusedRoomId; } Room room = new Room(name, unusedRoomId); map.put(unusedRoomId, room); totalRooms++; return unusedRoomId++; }else{ return -1; } } /** * 用戶加入一個房間 * @param user * @param roomID * @return */ public boolean join(User user, long roomID){ if(map.containsKey(roomID)){ map.get(roomID).addUser(user); return true; }else{ return false; } } /** * 用戶退出他的房間 * @param user * @param roomID * @return */ public int esc(User user, long roomID){ if(map.containsKey(roomID)){ int number = map.get(roomID).delUser(user); /*如果這個房間剩下的人數為0,那么刪除該房間*/ if(number==0){ map.remove(roomID); totalRooms--; return 0; } return 1; }else{ return -1; } } /** * 列出所有房間的列表,返回一個二維數組,strings[i][0]放房間的id,string[i][1]放房間的name * @return */ public String[][] listRooms(){ String[][] strings = new String[totalRooms][2]; int i=0; /*將map轉化為set并使用迭代器來遍歷*/ Set<Entry<Long, Room>> set = map.entrySet(); Iterator<Entry<Long, Room>> iterator = set.iterator(); while(iterator.hasNext()){ Map.Entry<Long, Room> entry = iterator.next(); long key = entry.getKey(); Room value = entry.getValue(); strings[i][0]=""+key; strings[i][1]=value.getName(); } return strings; } /** * 通過roomID來獲得房間 * @param roomID * @return */ public Room getRoom(long roomID){ if(map.containsKey(roomID)){ return map.get(roomID); } else return null; }}

服務端

Server

package Server;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import org.json.*;import Room.Room;import Room.RoomList;import User.User;/** * * @author lannooo * */public class Server { private ArrayList<User> allUsers; private RoomList rooms; private int port; private ServerSocket ss; private long unusedUserID; public final long MAX_USERS = 999999; /** * 通過port號來構造服務器端對象 * 維護一個總的用戶列表和一個房間列表 * @param port * @throws Exception */ public Server(int port) throws Exception { allUsers = new ArrayList<>(); rooms = new RoomList(); this.port=port; unusedUserID=1; ss = new ServerSocket(port); System.out.println("Server is builded!"); } /** * 獲得下一個可用的用戶id * @return */ private long getNextUserID(){ if(unusedUserID < MAX_USERS) return unusedUserID++; else return -1; } /** * 開始監聽,當接受到新的用戶連接,就創建一個新的用戶,并添加到用戶列表中 * 然后創建一個新的服務線程用于收發該用戶的消息 * @throws Exception */ public void startListen() throws Exception{ while(true){ Socket socket = ss.accept(); long id = getNextUserID(); if(id != -1){ User user = new User("User"+id, id, socket); System.out.println(user.getName() + " is login..."); allUsers.add(user); ServerThread thread = new ServerThread(user, allUsers, rooms); thread.start(); }else{ System.out.println("Server is full!"); socket.close(); } } } /** * 測試用main方法,設置偵聽端口為9999,并開始監聽 * @param args */ public static void main(String[] args) { try { Server server = new Server(9999); server.startListen(); } catch (Exception e) { e.printStackTrace(); } }}

ServerThread

package Server;import java.io.IOException;import java.io.PrintWriter;import java.net.SocketException;import java.util.ArrayList;import java.util.regex.Matcher;import java.util.regex.Pattern;import Room.Room;import Room.RoomList;import User.User;/** * * @author lannooo * */public class ServerThread extends Thread { private User user; private ArrayList<User> userList;/*保存用戶列表*/ private RoomList map; /*保存房間列表*/ private long roomId; private PrintWriter pw; /** * 通過用戶的對象實例、全局的用戶列表、房間列表進行構造 * @param user * @param userList * @param map */ public ServerThread(User user, ArrayList<User> userList, RoomList map){ this.user=user; this.userList=userList; this.map=map; pw=null; roomId = -1; } /** * 線程運行部分,持續讀取用戶socket發送來的數據,并解析 */ public void run(){ try{ while (true) { String msg=user.getBr().readLine(); System.out.println(msg); /*解析用戶的數據格式*/ parseMsg(msg); } }catch (SocketException se) { /*處理用戶斷開的異常*/ System.out.println("user "+user.getName()+" logout."); }catch (Exception e) { /*處理其他異常*/ e.printStackTrace(); }finally { try { /* * 用戶斷開或者退出,需要把該用戶移除 * 并關閉socket */ remove(user); user.getBr().close(); user.getSocket().close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } /** * 用正則表達式匹配數據的格式,根據不同的指令類型,來調用相應的方法處理 * @param msg */ private void parseMsg(String msg){ String code = null; String message=null; if(msg.length()>0){ /*匹配指令類型部分的字符串*/ Pattern pattern = Pattern.compile("<code>(.*)</code>"); Matcher matcher = pattern.matcher(msg); if(matcher.find()){ code = matcher.group(1); } /*匹配消息部分的字符串*/ pattern = Pattern.compile("<msg>(.*)</msg>"); matcher = pattern.matcher(msg); if(matcher.find()){ message = matcher.group(1); } switch (code) { case "join": // add to the room // code = 1, 直接顯示在textArea中 // code = 11, 在list中加入 // code = 21, 把當前房間里的所有用戶返回給client if(roomId == -1){ roomId = Long.parseLong(message); map.join(user, roomId); sendRoomMsgExceptSelf(buildCodeWithMsg("<name>"+user.getName()+"</name><id>"+user.getId()+"</id>", 11)); // 這個消息需要加入房間里已有用戶的列表 returnMsg(buildCodeWithMsg("你加入了房間:" + map.getRoom(roomId).getName(), 1)); returnMsg(buildCodeWithMsg(getMembersInRoom(), 21)); }else{ map.esc(user, roomId); sendRoomMsg(buildCodeWithMsg(""+user.getId(), 12)); long oldRoomId = roomId; roomId = Long.parseLong(message); map.join(user, roomId); sendRoomMsgExceptSelf(buildCodeWithMsg("<name>"+user.getName()+"</name><id>"+user.getId()+"</id>", 11)); returnMsg(buildCodeWithMsg("你退出房間:" + map.getRoom(oldRoomId).getName() + ",并加入了房間:" + roomId,1)); returnMsg(buildCodeWithMsg(getMembersInRoom(), 21)); } break; case "esc": // delete from room list // code = 2, 彈窗提示 // code = 12, 對所有該房間的其他用戶發送該用戶退出房間的信息,從list中刪除 if(roomId!=-1){ int flag=map.esc(user, roomId); sendRoomMsgExceptSelf(buildCodeWithMsg(""+user.getId(), 12)); long oldRoomId=roomId; roomId = -1; returnMsg(buildCodeWithMsg("你已經成功退出房間,不會收到消息", 2)); if(flag==0){ sendMsg(buildCodeWithMsg(""+oldRoomId, 13)); } }else{ returnMsg(buildCodeWithMsg("你尚未加入任何房間", 2)); } break; case "list": // list all the rooms // code = 3, 在客戶端解析rooms,并填充roomlist returnMsg(buildCodeWithMsg(getRoomsList(), 3)); break; case "message": // send message // code = 4, 自己收到的話,打印的是‘你說:....’否則打印user id對應的name sendRoomMsg(buildCodeWithMsg("<from>"+user.getId()+"</from><smsg>"+message+"</smsg>", 4)); break; case "create": // create a room // code=5,提示用戶進入了房間 // code=15,需要在其他所有用戶的room列表中更新 roomId = map.createRoom(message); map.join(user, roomId); sendMsg(buildCodeWithMsg("<rid>"+roomId+"</rid><rname>"+message+"</rname>", 15)); returnMsg(buildCodeWithMsg("你進入了創建的房間:"+map.getRoom(roomId).getName(), 5)); returnMsg(buildCodeWithMsg(getMembersInRoom(), 21)); break; case "setname": // set name for user // code=16,告訴房間里的其他人,你改了昵稱 user.setName(message); sendRoomMsg(buildCodeWithMsg("<id>"+user.getId()+"</id><name>"+message+"</name>", 16)); break; default: // returnMsg("something unknown"); System.out.println("not valid message from user"+user.getId()); break; } } } /** * 獲得該用戶房間中的所有用戶列表,并構造成一定格式的消息返回 * @return */ private String getMembersInRoom(){ /*先從room列表獲得該用戶的room*/ Room room = map.getRoom(roomId); StringBuffer stringBuffer = new StringBuffer(); if(room != null){ /*獲得房間中所有的用戶的列表,然后構造成一定的格式發送回去*/ ArrayList<User> users = room.getUsers(); for(User each: users){ stringBuffer.append("<member><name>"+each.getName()+ "</name><id>"+each.getId()+"</id></member>"); } } return stringBuffer.toString(); } /** * 獲得所有房間的列表,并構造成一定的格式 * @return */ private String getRoomsList(){ String[][] strings = map.listRooms(); StringBuffer sb = new StringBuffer(); for(int i=0; i<strings.length; i++){ sb.append("<room><rname>"+strings[i][1]+ "</rname><rid>"+strings[i][0]+"</rid></room>"); } return sb.toString(); } /** * 構造成一個統一的消息格式 * @param msg * @param code * @return */ private String buildCodeWithMsg(String msg, int code){ return "<code>"+code+"</code><msg>"+msg+"</msg>/n"; } /** * 這個是群發消息:全體用戶,code>10 * @param msg */ private void sendMsg(String msg) {// System.out.println("In sendMsg()"); /*取出用戶列表中的每一個用戶來發送消息*/ for(User each:userList){ try { pw=each.getPw(); pw.println(msg); pw.flush(); System.out.println(msg); } catch (Exception e) { System.out.println("exception in sendMsg()"); } } } /** * 只對同一房間的用戶發:code>10 * @param msg */ private void sendRoomMsg(String msg){ /*先獲得該用戶的房間號,然后往該房間發送消息*/ Room room = map.getRoom(roomId); if(room != null){ ArrayList<User> users = room.getUsers(); for(User each: users){ pw = each.getPw(); pw.println(msg); pw.flush(); } } } /** * 向房間中除了該用戶自己,發送消息 * @param msg */ private void sendRoomMsgExceptSelf(String msg){ Room room = map.getRoom(roomId); if(room != null){ ArrayList<User> users = room.getUsers(); for(User each: users){ if(each.getId()!=user.getId()){ pw = each.getPw(); pw.println(msg); pw.flush(); } } } } /** * 對于client的來信,返回一個結果,code<10 * @param msg */ private void returnMsg(String msg){ try{ pw = user.getPw(); pw.println(msg); pw.flush(); }catch (Exception e) { System.out.println("exception in returnMsg()"); } } /** * 移除該用戶,并向房間中其他用戶發送該用戶已經退出的消息 * 如果房間中沒人了,那么就更新房間列表給所有用戶 * @param user */ private void remove(User user){ if(roomId!=-1){ int flag=map.esc(user, roomId); sendRoomMsgExceptSelf(buildCodeWithMsg(""+user.getId(), 12)); long oldRoomId=roomId; roomId = -1; if(flag==0){ sendMsg(buildCodeWithMsg(""+oldRoomId, 13)); } } userList.remove(user); }}

客戶端

Client

package Client;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.HashMap;import java.util.Iterator;import java.util.Set;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.swing.DefaultListModel;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollBar;import javax.swing.JScrollPane;import javax.swing.JTextField;import javax.swing.JTextPane;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;import javax.swing.text.BadLocationException;import javax.swing.text.SimpleAttributeSet;import javax.swing.text.Style;import javax.swing.text.StyleConstants;import javax.swing.text.StyledDocument;/** * * @author lannooo * */public class Client implements ActionListener{ private JFrame frame; private Socket socket; private BufferedReader br; private PrintWriter pw; private String name; private HashMap<String, Integer> rooms_map; private HashMap<String, Integer> users_map; private JTextField host_textfield; private JTextField port_textfield; private JTextField text_field; private JTextField name_textfiled; private JLabel rooms_label; private JLabel users_label; private JList<String> roomlist; private JList<String> userlist; private JTextPane msgArea; private JScrollPane textScrollPane; private JScrollBar vertical; DefaultListModel<String> rooms_model; DefaultListModel<String> users_model; /* * 構造函數 * 該客戶端對象維護兩個map,房間的hashmap和房間中用戶的hashmap * 作為列表組件的數據模型 */ public Client(){ rooms_map = new HashMap<>(); users_map = new HashMap<>(); initialize(); } /** * 連接服務端,指定host和port * @param host * @param port * @return */ public boolean connect(String host, int port){ try { socket = new Socket(host, port); System.out.println("Connected to server!"+socket.getRemoteSocketAddress()); br=new BufferedReader(new InputStreamReader(System.in)); pw=new PrintWriter(socket.getOutputStream()); /* * 創建一個接受和解析服務器消息的線程 * 傳入當前客戶端對象的指針,作為句柄調用相應的處理函數 */ ClientThread thread = new ClientThread(socket, this); thread.start(); return true; } catch (IOException e) { System.out.println("Server error"); JOptionPane.showMessageDialog(frame, "服務器無法連接!"); return false; } } /*當前進程作為只發送消息的線程,從命令行中獲取輸入*/// public void sendMsg(){// String msg;// try {// while(true){// msg = br.readLine();// pw.println(msg);// pw.flush();// }// } catch (IOException e) {// System.out.println("error when read msg and to send.");// }// } /** * 發給服務器的消息,先經過一定的格式構造再發送 * @param msg * @param code */ public void sendMsg(String msg, String code){ try { pw.println("<code>"+code+"</code><msg>"+msg+"</msg>"); pw.flush(); } catch (Exception e) { //一般是沒有連接的問題 System.out.println("error in sendMsg()"); JOptionPane.showMessageDialog(frame, "請先連接服務器!"); } } /** * 窗口初始化 */ private void initialize() { /*設置窗口的UI風格和字體*/ setUIStyle(); setUIFont(); JFrame frame = new JFrame("ChatOnline"); JPanel panel = new JPanel(); /*主要的panel,上層放置連接區,下層放置消息區, 中間是消息面板,左邊是room列表,右邊是當前room的用戶列表*/ JPanel headpanel = new JPanel(); /*上層panel,用于放置連接區域相關的組件*/ JPanel footpanel = new JPanel(); /*下層panel,用于放置發送信息區域的組件*/ JPanel leftpanel = new JPanel(); /*左邊panel,用于放置房間列表和加入按鈕*/ JPanel rightpanel = new JPanel(); /*右邊panel,用于放置房間內人的列表*/ /*最上層的布局,分中間,東南西北五個部分*/ BorderLayout layout = new BorderLayout(); /*格子布局,主要用來設置西、東、南三個部分的布局*/ GridBagLayout gridBagLayout = new GridBagLayout(); /*主要設置北部的布局*/ FlowLayout flowLayout = new FlowLayout(); /*設置初始窗口的一些性質*/ frame.setBounds(100, 100, 800, 600); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(panel); frame.setLayout(layout); /*設置各個部分的panel的布局和大小*/ headpanel.setLayout(flowLayout); footpanel.setLayout(gridBagLayout); leftpanel.setLayout(gridBagLayout); rightpanel.setLayout(gridBagLayout); leftpanel.setPreferredSize(new Dimension(130, 0)); rightpanel.setPreferredSize(new Dimension(130, 0)); /*以下均是headpanel中的組件*/ host_textfield = new JTextField("127.0.0.1"); port_textfield = new JTextField("9999"); name_textfiled = new JTextField("匿名"); host_textfield.setPreferredSize(new Dimension(100, 25)); port_textfield.setPreferredSize(new Dimension(70, 25)); name_textfiled.setPreferredSize(new Dimension(150, 25)); JLabel host_label = new JLabel("服務器WordField","TextField", "Table", "Label", "Viewport", "RadioButtonMenuItem","RadioButton", "DesktopPane", "InternalFrame" }; for (String item : names) { UIManager.put(item+ ".font",f); } } /** * 設置UI風格為當前系統的風格 */ public static void setUIStyle(){ String lookAndFeel =UIManager.getSystemLookAndFeelClassName(); try { UIManager.setLookAndFeel(lookAndFeel); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalaccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 測試用的main函數 * @param args */ public static void main(String[] args) { Client client = new Client(); }}

ClientThread

package Client;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * @author lannooo * */public class ClientThread extends Thread{ private Socket socket; private Client client; private BufferedReader br; private PrintWriter pw; /** * 從過主線程傳入的socket和client對象來構造 * @param socket * @param client */ public ClientThread(Socket socket, Client client){ this.client = client; this.socket = socket; try { br=new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { System.out.println("cannot get inputstream from socket."); } } /** * 不斷的讀數據并處理 * 調用主線程的方法來處理:client.method(); */ public void run() { try{ br=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String msg = br.readLine(); parseMessage(msg); } }catch (Exception e) { e.printStackTrace(); } } /** * 處理從服務器收到的消息 * @param message */ public void parseMessage(String message){ String code = null; String msg=null; /* * 先用正則表達式匹配code碼和msg內容 */ if(message.length()>0){ Pattern pattern = Pattern.compile("<code>(.*)</code>"); Matcher matcher = pattern.matcher(message); if(matcher.find()){ code = matcher.group(1); } pattern = Pattern.compile("<msg>(.*)</msg>"); matcher = pattern.matcher(message); if(matcher.find()){ msg = matcher.group(1); } System.out.println(code+":"+msg); switch(code){ case "1": /*一個普通消息處理*/ client.updateTextArea(msg); break; case "2": /*退出消息*/ client.showEscDialog(msg); break; case "3": /*列出房間*/ client.listRooms(msg); break; case "4": /*其他用戶的消息*/ client.updateTextAreaFromUser(msg); break; case "5": /*普通消息處理*/ client.updateTextArea(msg); break; case "11": /*添加用戶*/ client.addUser(msg); break; case "12": /*刪除用戶*/ client.delUser(msg); break; case "13": /*刪除房間*/ client.delRoom(msg); break; case "15": /*添加房間*/ client.addRoom(msg); break; case "16": /*更新用戶名稱*/ client.updateUser(msg); break; case "21": /*列出用戶列表*/ client.listUsers(msg); break; } } }}

IconDialog(選擇表情界面)

package Client;import java.awt.Container;import java.awt.Dialog;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;/** * * @author lannooo * */public class IconDialog implements ActionListener { private JDialog dialog; private Client client; /** * 通過frame和客戶端對象來構造 * @param frame * @param client */ public IconDialog(JFrame frame, Client client) { this.client = client; dialog = new JDialog(frame, "請選擇表情", true); /*16個表情*/ JButton[] icon_button = new JButton[16]; ImageIcon[] icons = new ImageIcon[16]; /*獲得彈出窗口的容器,設置布局*/ Container dialogPane = dialog.getContentPane(); dialogPane.setLayout(new GridLayout(0, 4)); /*加入表情*/ for(int i=1; i<=15; i++){ icons[i] = new ImageIcon("icon/"+i+".png"); icons[i].setImage(icons[i].getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT)); icon_button[i] = new JButton(""+i, icons[i]); icon_button[i].addActionListener(this); dialogPane.add(icon_button[i]); } dialog.setBounds(200,266,266,280); dialog.show(); } @Override public void actionPerformed(ActionEvent e) { /*構造emoji結構的消息發送*/ String cmd = e.getActionCommand(); System.out.println(cmd); dialog.dispose(); client.sendMsg("<emoji>"+cmd+"</emoji>", "message"); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸水县| 成武县| 隆安县| 莎车县| 迁西县| 保山市| 泸溪县| 嘉峪关市| 始兴县| 庄浪县| 和林格尔县| 仪征市| 苏州市| 社会| 蚌埠市| 曲阜市| 博爱县| 准格尔旗| 万年县| 玉田县| 祁阳县| 富川| 宣威市| 射洪县| 通化市| 荆州市| 临泽县| 历史| 冀州市| 嵊州市| 盘锦市| 乡宁县| 虹口区| 通河县| 双辽市| 绿春县| 依兰县| 来宾市| 桐梓县| 河津市| 铜陵市|