6.面向对象程序设计(3)

com.langsin.LZChat.server2项目内的代码

jdbc包

复制代码
  1 package jdbc;
  2 
  3 import java.sql.Connection;
  4 import java.sql.DriverManager;
  5 import java.sql.PreparedStatement;
  6 import java.sql.ResultSet;
  7 import java.util.ArrayList;
  8 
  9 import model.TeamInfo;
 10 import model.UserInfo;
 11 /**
 12  * 建表 ddl dml select
 13  * 
 14  * 1.获取连接
 15  * 2.获取Statement 
 16  * 3.执行Statement
 17  * 4.如果是select语法,那么有ResultSet接受结果集
 18  * 5.关闭st和connection
 19  *
 20  * 
 21  * */
 22 public class jdbcUtil {
 23 
 24     private static String username = "lz";
 25     private static String pwd = "123";
 26     private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
 27     private static String driver = "oracle.jdbc.driver.OracleDriver";
 28     private static Connection conn = null;
 29 
 30     public static Connection getConnection() {
 31         try {
 32             Class.forName(driver);
 33             conn = DriverManager.getConnection(url, username, pwd);
 34         } catch (Exception e) {
 35             e.printStackTrace();
 36         }
 37 
 38         return conn;
 39     }
 40 public static void main(String[] args) {
 41     new jdbcUtil().getConnection();
 42 }
 43     // 注册qq号
 44     public void Reg(int qq, String pwd, String nickname, byte icon, String sex) {
 45         conn = jdbcUtil.getConnection();
 46         String sql = "insert into qqUser values(?,?,?,?,?,'')";
 47         PreparedStatement ps = null;
 48         try {
 49             ps = conn.prepareStatement(sql);
 50             ps.setInt(1, qq);
 51             ps.setString(2, pwd);
 52             ps.setString(3, nickname);
 53             ps.setByte(4, icon);
 54             ps.setString(5, sex);
 55             ps.execute();
 56             conn.commit();
 57             conn.close();
 58         } catch (Exception e) {
 59             e.printStackTrace();
 60         }
 61     }
 62 
 63     // 验证登陆
 64     public UserInfo checkLogin(int qq, String pwd) {
 65         conn = jdbcUtil.getConnection();
 66         String sql = "select * from qqUser where qq=?";
 67         PreparedStatement ps = null;
 68         ResultSet rs = null;
 69         UserInfo user = null;
 70         try {
 71             ps = conn.prepareStatement(sql);
 72             ps.setInt(1, qq);
 73             rs = ps.executeQuery();
 74             while (rs.next()) {
 75                 if(!pwd.equals(rs.getString(2))){
 76                     return null;
 77                 }
 78                 user = new UserInfo(rs.getInt(1), rs.getString(3),
 79                         rs.getString(5));
 80                 user.setIcon(rs.getByte(4));
 81                 TeamInfo team = new TeamInfo("");
 82                 String friendstr = rs.getString(6);
 83                 System.out.println("friendstr:"+friendstr);
 84                 if (friendstr!=null) {
 85                     String[] friends = rs.getString(6).split(",");
 86 
 87                     for (int i = 0; i < friends.length; i++) {
 88                         UserInfo userinfo = new UserInfo(
 89                                 Integer.valueOf(friends[i]));
 90                         team.addFriend(userinfo);
 91                     }
 92                 }
 93                 ArrayList<TeamInfo> teams = new ArrayList<TeamInfo>();
 94                 teams.add(team);
 95                 user.setTeams(teams);        
 96                 }        
 97             conn.commit();
 98             conn.close();
 99         } catch (Exception e) {
100             e.printStackTrace();
101         }
102         return user;
103     }
104 
105     // 根据qq 得到用户信息
106     public UserInfo getUser(int qq) {
107         conn = jdbcUtil.getConnection();
108         String sql = "select * from qqUser where qq=?";
109         PreparedStatement ps = null;
110         ResultSet rs = null;
111         UserInfo user = null;
112         try {
113             ps = conn.prepareStatement(sql);
114             ps.setInt(1, qq);
115             rs = ps.executeQuery();
116             while (rs.next()) {
117                 user = new UserInfo(qq, rs.getString(3), rs.getString(5));
118                 user.setIcon(rs.getByte(4));
119                 TeamInfo team = new TeamInfo("");
120                 if (rs.getString(6) != null) {
121                     String[] friends = rs.getString(6).split(",");
122 
123                     for (int i = 0; i < friends.length; i++) {
124                         UserInfo userinfo = new UserInfo(
125                                 Integer.valueOf(friends[i]));
126                         team.addFriend(userinfo);
127                     }
128                 }
129                 ArrayList<TeamInfo> teams = new ArrayList<TeamInfo>();
130                 teams.add(team);
131                 user.setTeams(teams);
132             }
133             conn.commit();
134             conn.close();
135         } catch (Exception e) {
136             e.printStackTrace();
137         }
138         return user;
139     }
140 
141     // 添加好友
142     public void addFriend(int qq, int friend) {
143         conn = jdbcUtil.getConnection();
144         String sql = "select friend from qqUser where qq=?";
145         PreparedStatement ps = null;
146         ResultSet rs = null;
147         String friends = "";
148         try {
149             ps = conn.prepareStatement(sql);
150             ps.setInt(1, qq);
151             rs = ps.executeQuery();
152             while (rs.next()) {
153                 
154                 friends = rs.getString(1);
155                 if(friends==null){
156                     friends = friend + ",";
157                 }else
158                     friends = friends+ friend+",";
159                 
160             }
161             
162             // 存入数据库
163             sql = "update qqUser set friend=? where qq=?";
164             ps = conn.prepareStatement(sql);
165             ps.setString(1, friends);
166             ps.setInt(2, qq);
167             ps.execute();
168             conn.commit();
169             conn.close();
170         } catch (Exception e) {
171             e.printStackTrace();
172         }
173     }
174 
175     // 获得最大号 
176     public int GetMaxNum() {
177         int maxNum = 1000;
178         conn = getConnection();
179         PreparedStatement ps = null;
180         ResultSet rs = null;
181         String sql = "select max(qq) from qqUser";
182         try {
183             ps = conn.prepareStatement(sql);
184             rs = ps.executeQuery();
185             while (rs.next()) {
186                 if (rs.getInt(1) > 1000)
187                     maxNum = rs.getInt(1);
188             }
189         } catch (Exception e) {
190             e.printStackTrace();
191         }
192         maxNum++;
193         return maxNum;
194     }
195 
196     // 调试数据库
197     // public static void main(String[] args) {
198     // jdbcUtil jdbc = new jdbcUtil();
199     // jdbc.Reg(123, "456", "sad", (byte)1, "男");
200     // jdbc.checkLogin(123, "456");
201     // }
202 }
复制代码

model包

复制代码
  1 package model;
  2 
  3 import java.io.Serializable;
  4 import java.util.ArrayList;
  5 
  6 /***
  7  * 用户类
  8  * @author Administrator
  9  *
 10  */
 11 @SuppressWarnings("serial")
 12 public class UserInfo implements Serializable{
 13 
 14     private int qq;                                //qq号码
 15     private String pwd;                               //密码
 16     private String nickname;                       //用户昵称
 17     private String sex;                            //用户性别
 18     private byte icon;                               //头像
 19     
 20     private byte onLine = 1;                       //用户是否在线                 默认为1  即不在线   
 21     
 22     private ArrayList<TeamInfo> teams = new ArrayList<TeamInfo>();        //好友列表
 23     
 24     public UserInfo(int qq){
 25         this.qq = qq;
 26 //        init();
 27     }
 28     
 29     public UserInfo(int qq,String nickname,String sex){
 30         this.qq = qq;
 31         this.nickname = nickname;
 32         this.sex = sex;
 33 //        init();
 34     }
 35     
 36     //初始化用户
 37 //    public void init(){
 38 //        TeamInfo team1,team2,team3; 
 39 //        team1= new TeamInfo(0, "我的好友", this.qq);
 40 //        team2= new TeamInfo(1, "陌生人", this.qq);
 41 //        team3= new TeamInfo(2, "黑名单", this.qq);
 42 //        this.teams.add(team1);
 43 //        this.teams.add(team2);
 44 //        this.teams.add(team3);
 45 //    }
 46     
 47     public void addTeam(TeamInfo team){
 48         this.teams.add(team);
 49     }
 50     
 51     
 52     //get set 方法
 53     
 54     
 55     public int getQq() {
 56         return qq;
 57     }
 58 
 59     public byte getIcon() {
 60         return icon;
 61     }
 62 
 63     public void setIcon(byte icon) {
 64         this.icon = icon;
 65     }
 66 
 67     public byte getOnLine() {
 68         return onLine;
 69     }
 70 
 71     public void setOnLine(byte onLine) {
 72         this.onLine = onLine;
 73     }
 74 
 75     public String getSex() {
 76         return sex;
 77     }
 78 
 79     public void setSex(String sex) {
 80         this.sex = sex;
 81     }
 82 
 83     public void setQq(int qq) {
 84         this.qq = qq;
 85     }
 86 
 87     public String getPwd() {
 88         return pwd;
 89     }
 90 
 91     public void setPwd(String pwd) {
 92         this.pwd = pwd;
 93     }
 94 
 95     public String getNickname() {
 96         return nickname;
 97     }
 98 
 99     public void setNickname(String nickname) {
100         this.nickname = nickname;
101     }
102 
103     public ArrayList<TeamInfo> getTeams() {
104         return teams;
105     }
106 
107     public void setTeams(ArrayList<TeamInfo> teams) {
108         this.teams = teams;
109     }
110 
111     @Override
112     public String toString() {
113         return "UserInfo [qq=" + qq + ", nickname=" + nickname + ", sex=" + sex
114                 + ", icon=" + icon + "]";
115     }
116     
117     
118 }
复制代码
复制代码
  1 package model;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileOutputStream;
  6 import java.io.ObjectInputStream;
  7 import java.io.ObjectOutputStream;
  8 import java.util.Collections;
  9 import java.util.HashMap;
 10 import java.util.Map;
 11 
 12 import tools.LogTools;
 13 
 14 /***
 15  * 数据存储
 16  * @author Administrator
 17  *
 18  */
 19 @SuppressWarnings({ "unchecked", "rawtypes" })
 20 public class UserDao {
 21 
 22     private static int maxQQNumber = 1000;
 23     private static final String dbFileName = "qq.dat";
 24     private static Map<Integer, UserInfo> userDB = new HashMap<Integer,UserInfo>();
 25     
 26     static{
 27         try {
 28             File file = new File(dbFileName);
 29             if(file.exists()&&!file.isDirectory()){
 30                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
 31                 userDB = (Map)ois.readObject();
 32                 LogTools.INFO(UserDao.class, "从数据文件读取数据成功!");
 33             }else{
 34                 LogTools.ERROR(UserDao.class, "不存在数据文件,创建空表");
 35             }
 36             
 37         } catch (Exception e) {
 38             // TODO: handle exception
 39         }
 40     }
 41     
 42     //用户登录
 43     public static UserInfo checkLogin(int qq,String pwd){
 44         UserInfo user = userDB.get(qq);
 45         if(null!=user && pwd.equals(user.getPwd())){
 46             LogTools.INFO(UserDao.class, "登录成功!");
 47             return user;
 48         }
 49         LogTools.ERROR(UserDao.class, "登录失败!");
 50         return null;
 51     }
 52     
 53     //注册用户
 54     public static int regUser(String pwd,String nickname,String sex){
 55         if(userDB.size()>0){
 56             maxQQNumber = Collections.max(userDB.keySet());
 57         }
 58         maxQQNumber++;
 59         UserInfo user = new UserInfo(maxQQNumber);
 60         user.setPwd(pwd);
 61         user.setNickname(nickname);
 62         user.setSex(sex);
 63         userDB.put(maxQQNumber, user);
 64         saveDB();
 65         return maxQQNumber;
 66     }
 67     
 68     //将内存中的数据保存到文件中
 69     private static void saveDB(){
 70         try {
 71             ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream(dbFileName));
 72             ois.writeObject(userDB);
 73             ois.close();
 74             LogTools.INFO(UserDao.class, "刷新数据文件成功!");
 75         } catch (Exception e) {
 76             LogTools.ERROR(UserDao.class, "刷新数据文件失败:"+e);
 77         }
 78     }
 79     
 80     /**
 81      * 根据qq号码  得到用户的信息
 82      * @param qq           qq号码 
 83      * @return              用户的信息
 84      */
 85     public static UserInfo getUserInfo(int qq){
 86         return userDB.get(qq);
 87     }
 88     
 89     /**
 90      * 添加好友的数据库操作
 91      * @param qq1           
 92      * @param qq2             相互添加好友的号码
 93      * @param groupName1    
 94      * @param groupName2    分别加入的群组
 95      */
 96     public static void addFriend(int qq1,int qq2,String groupName1,String groupName2){
 97         UserInfo user1 = getUserInfo(qq1);
 98         UserInfo user2 = getUserInfo(qq2);
 99         //暂时默认添加到好友队列
100         user1.getTeams().get(0).addFriend(user2);
101         user2.getTeams().get(0).addFriend(user1);
102         //保存
103         saveDB();
104     }
105 }
复制代码
复制代码
  1 package model;
  2 
  3 import java.io.ByteArrayInputStream;
  4 import java.io.DataInputStream;
  5 import java.io.IOException;
  6 import java.util.ArrayList;
  7 
  8 import msg.MsgAddFriend;
  9 import msg.MsgAddFriendResp;
 10 import msg.MsgAddYou;
 11 import msg.MsgAddYouResp;
 12 import msg.MsgChatFile;
 13 import msg.MsgChatText;
 14 import msg.MsgFindResp;
 15 import msg.MsgHead;
 16 import msg.MsgLogin;
 17 import msg.MsgLoginResp;
 18 import msg.MsgPerData;
 19 import msg.MsgReg;
 20 import msg.MsgRegResp;
 21 import msg.MsgTeamList;
 22 import msg.MsgType;
 23 import tools.LogTools;
 24 
 25 /***
 26  * 解包消息
 27  * 
 28  * @author Administrator
 29  * 
 30  */
 31 public class ToolsParseMsg {
 32 
 33     public static MsgHead parseMsg(byte[] data) throws IOException {
 34         int totalLen = data.length + 4; // 算出消息总长
 35         ByteArrayInputStream bis = new ByteArrayInputStream(data);
 36         DataInputStream dis = new DataInputStream(bis);
 37         byte msgType = dis.readByte();
 38         int src = dis.readInt();
 39         int dest = dis.readInt();
 40         MsgHead msgHead = new MsgHead();
 41         msgHead.setTotalLen(totalLen);
 42         msgHead.setType(msgType);
 43         msgHead.setSrc(src);
 44         msgHead.setDest(dest);
 45         //根据类型进行判断
 46         switch (msgType) {
 47         //注册
 48         case MsgType.command_reg:                
 49             MsgReg mr = new MsgReg();
 50             copyHead(msgHead, mr);
 51             String nickname = readString(dis, 10);
 52             mr.setNickname(nickname);
 53             String pwd = readString(dis, 10);
 54             mr.setPwd(pwd);
 55             String sex = readString(dis, 10);
 56             mr.setSex(sex);
 57             byte icon = dis.readByte();
 58             mr.setIcon(icon);
 59             return mr;
 60         //注册应答    
 61         case MsgType.command_reg_resp:              
 62             MsgRegResp mrr = new MsgRegResp();
 63             copyHead(msgHead, mrr);
 64             mrr.setState(dis.readByte());
 65             return mrr;
 66         //登陆
 67         case MsgType.command_login:
 68             MsgLogin ml = new MsgLogin();
 69             copyHead(msgHead, ml);
 70             ml.setPwd(readString(dis, 10));
 71             return ml;
 72         //登陆应答
 73         case MsgType.command_login_resp:
 74             MsgLoginResp mlr = new MsgLoginResp();
 75             copyHead(msgHead, mlr);
 76             mlr.setState(dis.readByte());
 77             return mlr;    
 78         //好友列表
 79         case MsgType.command_teamList:
 80             MsgTeamList mtl  =new MsgTeamList();
 81             copyHead(msgHead, mtl);
 82             int listCount = dis.readInt();  //得到分组个数
 83             ArrayList<TeamInfo> teamList = new ArrayList<TeamInfo>();
 84             for (int i = 0; i < listCount; i++) {                
 85                 String groupName = readString(dis, 10);   //得到某一分组名字
 86                 TeamInfo teamInfo = new TeamInfo(groupName);
 87                 byte usersCount = dis.readByte();  //得到某一分组的成员个数
 88                 for (int j = 0; j < usersCount; j++) {
 89                     int qq  = dis.readInt();                            //得到qq号码
 90                     String nickname2 = readString(dis, 10);             //得到昵称
 91                     String sex2 = readString(dis, 10);                 //得到性别
 92                     byte teamList_icon = dis.readByte();             //得到头像
 93                     
 94                     byte onLine = dis.readByte();                    //得到是否在线
 95                     UserInfo userInfo = new UserInfo(qq, nickname2, sex2);
 96                     userInfo.setOnLine(onLine);
 97                     userInfo.setIcon(teamList_icon);
 98                     teamInfo.addFriend(userInfo);
 99                 }
100                 teamList.add(teamInfo);
101             }
102             mtl.setTeamList(teamList);
103             return mtl;
104         //在线qq列表  返回
105         case MsgType.command_find_resp:                     
106             MsgFindResp mfr = new MsgFindResp();
107             copyHead(msgHead, mfr);
108             int count = dis.readInt();
109             for (int i = 0; i < count; i++) {
110                 int qq = dis.readInt();
111                 String nickName = readString(dis, 10);
112                 String mfr_sex = readString(dis, 10);
113                 byte find_resp_icon = dis.readByte();
114                 UserInfo userInfo = new UserInfo(qq, nickName, mfr_sex);
115                 userInfo.setIcon(find_resp_icon);
116                 mfr.addQq(userInfo);
117             }
118             return mfr;
119         //添加好友  请求
120         case MsgType.command_addFriend:
121             MsgAddFriend maf = new MsgAddFriend();
122             copyHead(msgHead, maf);
123             maf.setFriendQq(dis.readInt());
124             String note = readString(dis, 30);    //!!!!!!30字节长度!!!!!!
125             maf.setNote(note);
126             return maf;
127         //添加好友 回复
128         case MsgType.command_addFriend_Resp:
129             MsgAddFriendResp mafr = new MsgAddFriendResp();
130             copyHead(msgHead, mafr);
131             mafr.setState(dis.readByte());
132             mafr.setQq(dis.readInt());
133             String nickName = readString(dis, 10);
134             mafr.setNickName(nickName);
135             String addFriend_Resp_sex = readString(dis, 10);    //性别
136             mafr.setSex(addFriend_Resp_sex);
137             mafr.setIcon(dis.readByte());
138             return mafr;    
139         //有人添加你为好友
140         case MsgType.command_addYou:
141             MsgAddYou may = new MsgAddYou();
142             copyHead(msgHead, may);
143             String addYou_nickname = readString(dis, 10);
144             may.setNickname(addYou_nickname);
145             String addYou_sex = readString(dis, 10);                 //性别
146             may.setSex(addYou_sex);
147             String addYou_note = readString(dis, 30);                  //备注
148             may.setNote(addYou_note);
149             return may;
150         //有人添加你为好友  的  回复
151         case MsgType.command_addYouResp:
152             MsgAddYouResp mayr = new MsgAddYouResp();
153             copyHead(msgHead, mayr);
154             mayr.setState(dis.readByte());
155             return mayr;
156         //聊天信息
157         case MsgType.command_chatText:
158             MsgChatText mct = new MsgChatText();
159             copyHead(msgHead, mct);
160             String time = readString(dis, 20);
161             mct.setTime(time);
162             int len = totalLen-4-1-4-4-20;
163             String chat = readString(dis, len);
164             mct.setContent(chat);
165             return mct;
166         //文件传输
167         case MsgType.command_chatFile:
168             MsgChatFile mcf = new MsgChatFile();
169             copyHead(msgHead, mcf);
170             String chatFile_time = readString(dis, 20);
171             mcf.setTime(chatFile_time);
172             String fileName = readString(dis, 256);
173             mcf.setFileName(fileName);
174             int filelen = totalLen-4-1-4-4-256-20;
175             byte[] fileData = new byte[filelen];
176             dis.readFully(fileData);
177             mcf.setFileData(fileData);
178             return mcf;
179         case MsgType.command_perdata:
180             MsgPerData mpd = new MsgPerData();
181             copyHead(msgHead, mpd);
182             String perdata_nickname = readString(dis, 10);
183             mpd.setNickname(perdata_nickname);
184             String perdata_sex = readString(dis, 10);
185             mpd.setSex(perdata_sex);
186             mpd.setIcon(dis.readByte());
187             return mpd;
188         //返回在线qq号码请求
189         case MsgType.command_find:
190         case MsgType.command_onLine:
191         case MsgType.command_offLine:
192         case MsgType.command_vibration:
193             return msgHead;
194         default:
195             String logMsg = "解包未知消息类型,无法解包:type:" + msgType;
196             LogTools.ERROR(ToolsParseMsg.class, logMsg);   //记录日志信息
197             break;
198         }
199 
200         return null;
201 
202     }
203     
204     /**
205      * 复制消息头的数据
206      * @param head   消息头
207      * @param dest   要复制到的对象
208      */
209     public static void copyHead(MsgHead head,MsgHead dest){
210         dest.setTotalLen(head.getTotalLen());
211         dest.setType(head.getType());
212         dest.setSrc(head.getSrc());
213         dest.setDest(head.getDest());
214     }
215     
216     /**
217      * 从流中读取len长度的字节
218      * @param dous    流数据
219      * @param len     长度
220      * @throws IOException 
221      */
222     public static String readString(DataInputStream dis,int len) throws IOException{
223         byte[] data = new byte[len];
224         dis.readFully(data);
225         return new String(data);
226     }
227 }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
package model;
 
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
 
import msg.MsgAddFriend;
import msg.MsgAddFriendResp;
import msg.MsgAddYou;
import msg.MsgAddYouResp;
import msg.MsgChatFile;
import msg.MsgChatText;
import msg.MsgFindResp;
import msg.MsgHead;
import msg.MsgLogin;
import msg.MsgLoginResp;
import msg.MsgPerData;
import msg.MsgReg;
import msg.MsgRegResp;
import msg.MsgTeamList;
import msg.MsgType;
import tools.LogTools;
 
/***
 * 打包消息
 * @author Administrator
 *
 */
public class ToolsCreateMsg {
 
    /**
     * 将消息对象打包成字节数组返回
     * @param msg   要打包的消息对象
     * @return      返回的字节数组
     * @throws IOException
     */
    public static byte[] packMsg(MsgHead msg) throws IOException{
        ByteArrayOutputStream bous = new ByteArrayOutputStream();
        DataOutputStream dous = new DataOutputStream(bous);
        writeHead(dous, msg);
        int msgType = msg.getType();
         
        switch (msgType) {
        //注册
        case MsgType.command_reg:                   
            MsgReg mr = (MsgReg)msg;
            writeString(dous, 10, mr.getNickname());
            writeString(dous, 10, mr.getPwd());
            writeString(dous, 10, mr.getSex());
            dous.writeByte((byte)mr.getIcon());
            break;
        //注册应答
        case MsgType.command_reg_resp:
            MsgRegResp mrr = (MsgRegResp)msg;
            dous.writeByte(mrr.getState());
            break;
        //登陆
        case MsgType.command_login:
            MsgLogin ml = (MsgLogin) msg;
            writeString(dous, 10, ml.getPwd());
            break;
        //登陆应答
        case MsgType.command_login_resp:
            MsgLoginResp mlr = (MsgLoginResp) msg;
            dous.writeByte(mlr.getState());
            break;
        //好友列表
        case MsgType.command_teamList:               
            MsgTeamList mtl = (MsgTeamList)msg;
            ArrayList<TeamInfo> teams = mtl.getTeamList();
            int listCount = teams.size();
            dous.writeInt(listCount);         //写入分组个数
            for (TeamInfo teamInfo : teams) {
                writeString(dous, 10, teamInfo.getName());  //写入分组名字
                ArrayList<UserInfo> users = teamInfo.getFriendList();
                dous.writeByte(users.size());                //写入一个分组的成员个数
                for (UserInfo userInfo : users) {
                    dous.writeInt(userInfo.getQq());                //写入qq号
                    writeString(dous, 10, userInfo.getNickname());  //写入昵称
                    writeString(dous, 10, userInfo.getSex());       //写入性别
                    dous.writeByte(userInfo.getIcon());             //写入头像
                     
                    dous.writeByte(userInfo.getOnLine());           //写入是否在线
                }
            }
            break;
        //返回在线qq号码
        case MsgType.command_find_resp:                     
            MsgFindResp mfr = (MsgFindResp)msg;
            ArrayList<UserInfo> users = mfr.getUsers();
            dous.writeInt(users.size());                         //写入在线qq的数量
            for (UserInfo userInfo : users) {
                dous.writeInt(userInfo.getQq());                 //写入qq 昵称  性别  头像
                writeString(dous, 10, userInfo.getNickname());
                writeString(dous, 10, userInfo.getSex());
                dous.writeByte(userInfo.getIcon());
            }
//          for (int i = 0; i < count; i++) {
//              UserInfo userInfo = users.get(i);
//              dous.writeInt(userInfo.getQq());
//              writeString(dous, 10, userInfo.getNickname());
//              writeString(dous, 10, userInfo.getSex());
//          }
            break;
        //添加好友
        case MsgType.command_addFriend:                     
            MsgAddFriend maf = (MsgAddFriend) msg;
            dous.writeInt(maf.getFriendQq());
            writeString(dous, 30, maf.getNote());      //!!!!!!30字节长度!!!!!!
            break;
        //添加好友应答
        case MsgType.command_addFriend_Resp:     
            MsgAddFriendResp magr = (MsgAddFriendResp) msg;
            dous.writeByte(magr.getState());             //对方是否同意
            dous.writeInt(magr.getQq());                 //对方qq
            writeString(dous, 10, magr.getNickName());   //对方昵称
            writeString(dous, 10, magr.getSex());        //对方的性别
            dous.writeByte(magr.getIcon());
            break;
        //有人添加你为好友
        case MsgType.command_addYou:
            MsgAddYou may = (MsgAddYou) msg;
            writeString(dous, 10, may.getNickname());      //昵称
            writeString(dous, 10, may.getSex());           //性别
            writeString(dous, 30, may.getNote());          //备注信息
            break;
        //有人添加你为好友  的  回复
        case MsgType.command_addYouResp:
            MsgAddYouResp mayr = (MsgAddYouResp) msg;
            dous.writeByte(mayr.getState());       
            break;
        //聊天信息
        case MsgType.command_chatText:
            MsgChatText mct = (MsgChatText) msg;
            writeString(dous, 20, mct.getTime());
            dous.write(mct.getContent().getBytes());
            break;
        //文件传输
        case MsgType.command_chatFile:
            MsgChatFile mcf = (MsgChatFile) msg;
            writeString(dous, 20, mcf.getTime());
            writeString(dous, 256, mcf.getFileName());
            dous.write(mcf.getFileData());
            break;
        case MsgType.command_perdata:
            MsgPerData mpd = (MsgPerData) msg;
            writeString(dous, 10, mpd.getNickname());
            writeString(dous, 10, mpd.getSex());
            dous.writeByte(mpd.getIcon());
            break;
        //返回在线qq号码请求
        case MsgType.command_find:          
        case MsgType.command_onLine:
        case MsgType.command_offLine:
        case MsgType.command_vibration:
            break;
        default:
            String logMsg="创建未知消息类型,无法打包:type:"+msgType;
            LogTools.ERROR(ToolsCreateMsg.class, logMsg);   //记录日志
            break;
        }
        dous.flush();
        byte[] data = bous.toByteArray();
        return data;       
    }
     
    /**
     * 向流中写入消息头信息
     * @param dous   要写入的流对象
     * @param msg    消息头对象
     * @throws IOException
     */
    public static void writeHead(DataOutputStream dous,MsgHead msg) throws IOException{
        dous.writeInt(msg.getTotalLen());
        dous.writeByte(msg.getType());
        dous.writeInt(msg.getSrc());
        dous.writeInt(msg.getDest());
    }
     
    /**
     * 向流中写入len长的字符串
     * @param dous    要写入的输出流
     * @param len       要写入字符串的长度
     * @param s         要写入的字符串
     * @throws IOException
     */
    public static void writeString(DataOutputStream dous,int len,String s) throws IOException{
        byte[] data = s.getBytes();
        if(data.length>len)
            throw new IOException("写入长度为:"+len+",文本过长!");
        dous.write(data);
        while(len>data.length){//如果短,需要补0
            dous.writeByte('\0');  //补二进制的0
            len--;
        }
    }
}

 

复制代码
 1 package model;
 2 
 3 import java.io.Serializable;
 4 import java.util.ArrayList;
 5 
 6 /***
 7  * 好友分组
 8  * @author Administrator
 9  *
10  */
11 @SuppressWarnings("serial")
12 public class TeamInfo implements Serializable{
13 
14     private int id;                    //分组id
15     private String name;            //分组名字
16     private int ownerUser;            //所有者
17     //在此分组内的好友列表
18     private ArrayList<UserInfo> friendList = new ArrayList<UserInfo>();
19     
20     public TeamInfo(int id, String name, int ownerUser) {
21         this.id = id;
22         this.name = name;
23         this.ownerUser = ownerUser;
24     }
25     /**
26      * 为此分组加入一个成员
27      * @param info
28      */
29     public void addFriend(UserInfo info){
30         this.friendList.add(info);
31     }
32     
33     public TeamInfo(String name) {
34         this.name = name;
35     }
36     
37     //get set 方法
38     public int getId() {
39         return id;
40     }
41 
42     public void setId(int id) {
43         this.id = id;
44     }
45 
46     public String getName() {
47         return name;
48     }
49 
50     public void setName(String name) {
51         this.name = name;
52     }
53 
54     public int getOwnerUser() {
55         return ownerUser;
56     }
57 
58     public void setOwnerUser(int ownerUser) {
59         this.ownerUser = ownerUser;
60     }
61 
62     public ArrayList<UserInfo> getFriendList() {
63         return friendList;
64     }
65 
66     public void setFriendList(ArrayList<UserInfo> friendList) {
67         this.friendList = friendList;
68     }
69     
70     
71 }
复制代码

msg包内容等同于上个项目的msg包
sever包

复制代码
  1 package server;
  2 
  3 import java.io.DataInputStream;
  4 import java.io.DataOutputStream;
  5 import java.io.IOException;
  6 import java.net.Socket;
  7 
  8 import jdbc.jdbcUtil;
  9 import model.ToolsCreateMsg;
 10 import model.ToolsParseMsg;
 11 import model.UserInfo;
 12 import msg.MsgHead;
 13 import msg.MsgLogin;
 14 import msg.MsgLoginResp;
 15 import msg.MsgPerData;
 16 import msg.MsgReg;
 17 import msg.MsgRegResp;
 18 import msg.MsgTeamList;
 19 import msg.MsgType;
 20 import tools.LogTools;
 21 
 22 public class ServerTread extends Thread {
 23 
 24     private jdbcUtil jdbc = new jdbcUtil();
 25     private Socket client;
 26     private DataOutputStream dous;     //输出流
 27     private DataInputStream dis;       //输入流
 28     private UserInfo ownerUser;
 29     private boolean loginOK = false;
 30     private boolean ok = false;   //注册用户
 31     
 32     public ServerTread(Socket socket){
 33         this.client = socket;
 34     }
 35     
 36     @Override
 37     public void run() {
 38         /**
 39          * 读取第一条消息,这个时候称之为:同步消息,等待的消息,必须等消息到达读到才能进行后续代码执行。
 40          * 有两种可能:1  登陆  2 注册
 41          */
 42         try {
 43             loginOK = readFirstMsg();
 44             
 45             while(loginOK){
 46                 MsgHead msg = this.reciveData();// 循环接收消息
 47                 ServerThreadManage.sendMsgToOther(this.ownerUser,msg);//处理接收到的消息
 48             }
 49         } catch (IOException e) {
 50             // TODO Auto-generated catch block
 51             //e.printStackTrace();
 52             LogTools.ERROR(this.getClass(), "连接客户端失败:" + e);
 53         }
 54         
 55         if(ok)
 56             ServerThreadManage.removeClient(this.ownerUser);
 57     }
 58 
 59     /**
 60      * 从流中接受数据   并转换为消息对象
 61      * @return        消息对象
 62      * @throws IOException 
 63      */
 64     private MsgHead reciveData() throws IOException {
 65         int len = dis.readInt();
 66         LogTools.INFO(this.getClass(), "服务器读消息长度:" + len);
 67         byte[] data = new byte[len-4];
 68         dis.readFully(data);
 69         /**
 70          * 现在data数组中有数据了 
 71          * 接下来就是将data字节数组中的数据解析到对应的消息领域对象中
 72          */
 73         MsgHead msg = ToolsParseMsg.parseMsg(data);
 74         LogTools.INFO(this.getClass(), "服务器读到消息对象:" + msg);
 75         return msg;
 76     }
 77 
 78     /**
 79      * 读取第一条数据
 80      * @return
 81      */
 82     private boolean readFirstMsg() {
 83         try {
 84             this.dous = new DataOutputStream(client.getOutputStream());
 85             this.dis = new DataInputStream(client.getInputStream());
 86             MsgHead msg = reciveData();
 87             if(msg.getType() == MsgType.command_login){
 88                 ok = true;
 89                 MsgLogin ml = (MsgLogin)msg;
 90                 return checkLogin(ml);
 91             }
 92             if(msg.getType() == MsgType.command_reg){
 93                 MsgReg mr = (MsgReg) msg;
 94                 // 保存注册,生成qq号,回复应答消息
 95                 //int qq = UserDao.regUser(mr.getPwd(), mr.getNickname(),mr.getSex(),mr.getIcon());
 96                 int qq = jdbc.GetMaxNum();
 97                 jdbc.Reg(qq, mr.getPwd(), mr.getNickname(), mr.getIcon(), mr.getSex());
 98                 MsgRegResp mrr = new MsgRegResp();
 99                 mrr.setTotalLen(4+1+4+4+1);
100                 mrr.setType(MsgType.command_reg_resp);
101                 mrr.setSrc(MsgType.SERVER_QQ_NUMBER);
102                 mrr.setDest(qq);
103                 mrr.setState((byte)0);
104                 this.sendMsg(mrr);
105             }
106             
107         } catch (IOException e) {
108             LogTools.ERROR(this.getClass(), "readFirstMsg失败:" + e);
109             //e.printStackTrace();
110         }
111         
112         return false;
113     }
114 
115     
116 
117     /**
118      * 发送一条消息对象给这个对象所代表的客户端用户
119      * @param msg  要发送的信息
120      * @return     是否发送成功
121      */
122     public boolean sendMsg(MsgHead msg) {
123         try {
124             byte[] data = ToolsCreateMsg.packMsg(msg);
125             this.dous.write(data);
126             this.dous.flush();
127             LogTools.INFO(this.getClass(), "服务器发出消息对象:" + msg);
128             return true;
129         } catch (IOException e) {
130             LogTools.ERROR(this.getClass(), "服务器发出消息出错:" + msg);
131             e.printStackTrace();
132         }
133         return false;
134     }
135 
136     
137     /**
138      * 检查登陆是否成功
139      * @param ml   登录信息
140      * @return     是否成功
141      */
142     private boolean checkLogin(MsgLogin ml) {
143         //ownerUser = UserDao.checkLogin(ml.getSrc(),ml.getPwd());
144         ownerUser = jdbc.checkLogin(ml.getSrc(),ml.getPwd());
145         if(ownerUser != null){
146             // 登陆成功1.回应答包,2.将这个处理线程对象加到队列中
147             MsgLoginResp mlr = new MsgLoginResp();
148             mlr.setTotalLen(4+1+4+4+1);
149             mlr.setType(MsgType.command_login_resp);
150             mlr.setSrc(MsgType.SERVER_QQ_NUMBER);
151             mlr.setDest(ownerUser.getQq());
152             mlr.setState((byte)0);
153             this.sendMsg(mlr);// 发送应答消息
154             //创建好友信息表  并发送
155 //            MsgTeamList mt = new MsgTeamList();
156 //            int len = 4+1+4+4+4;            //最后的这个加4:
157 //            ArrayList<TeamInfo> teams = ownerUser.getTeams();
158 //            for (TeamInfo teamInfo : teams) {            
159 //                int count = teamInfo.getFriendList().size();
160 //                len += 10+1;
161 //                len += count*(10+4+10);
162 //            }
163 //            mt.setTotalLen(len);
164 //            mt.setSrc(MsgType.SERVER_QQ_NUMBER);
165 //            mt.setDest(ownerUser.getQq());
166 //            mt.setType(MsgType.command_teamList);
167 //            mt.setTeamList(ownerUser.getTeams());
168 //            this.sendMsg(mt);
169             ServerThreadManage.addClient(ownerUser, this);
170             
171             MsgPerData mpd = new MsgPerData();
172             mpd.setType(MsgType.command_perdata);
173             ServerThreadManage.sendMsgToOther(ownerUser, mpd);
174             
175             MsgTeamList mtl = new MsgTeamList();
176             mtl.setType(MsgType.command_teamList);
177             ServerThreadManage.sendMsgToOther(ownerUser, mtl);
178             return true;
179         }
180         this.disConn();// 登陆失败,直接断开
181         return false;
182     }
183     /**
184      *  断开连结这个处理线程与客户机的连结, 发生异常,或处理线程退出时调用    
185      */
186     public void disConn() {        
187         try {
188             loginOK = false;
189             this.client.close();
190         } catch (IOException e) {
191             e.printStackTrace();
192         }
193     }
194 }
复制代码
复制代码
  1 package server;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.Iterator;
  6 import java.util.Map;
  7 import java.util.Random;
  8 import java.util.Set;
  9 
 10 import jdbc.jdbcUtil;
 11 import model.TeamInfo;
 12 import model.UserInfo;
 13 import msg.MsgAddFriend;
 14 import msg.MsgAddFriendResp;
 15 import msg.MsgAddYou;
 16 import msg.MsgAddYouResp;
 17 import msg.MsgFindResp;
 18 import msg.MsgHead;
 19 import msg.MsgPerData;
 20 import msg.MsgTeamList;
 21 import msg.MsgType;
 22 
 23 /***
 24  * 服务器管理线程的类
 25  * 因为需要在其他类中调用    所有方法都为静态方法
 26  * @author Administrator
 27  *
 28  */
 29 public class ServerThreadManage {
 30     
 31     private static jdbcUtil jdbc = new jdbcUtil();
 32     //保存线程的对象列表
 33     private static Map<UserInfo,ServerTread> stList = new HashMap<UserInfo, ServerTread>();
 34     //注册码
 35     @SuppressWarnings("unused")
 36     private static Map<Integer, String> regMsg = new HashMap<Integer, String>();
 37     
 38     /**
 39      * 用户登录后将线程添加到队列中
 40      * @param user        用户
 41      * @param st        线程
 42      */
 43     public static void addClient(UserInfo user,ServerTread st){
 44         stList.put(user, st);
 45         setOnOffLineMsg(user, true);
 46     }
 47     
 48     /**
 49      * 移除列表中的线程
 50      * @param user
 51      */
 52     public static void removeClient(UserInfo user){
 53         ServerTread ct = stList.remove(user);
 54         ct.disConn();
 55         ct = null;
 56         setOnOffLineMsg(user, false);
 57     }
 58     /**
 59      * 移除列表中的所有线程
 60      * @param user
 61      */
 62     public static void removeClients(){
 63         Set<UserInfo> users = stList.keySet();
 64         Iterator<UserInfo> its = users.iterator();
 65         while(its.hasNext()){
 66             ServerTread ct = stList.remove(its.next());
 67             ct.disConn();
 68             ct = null;
 69         }
 70     }
 71     
 72     /**
 73      * 用户上线下线信息
 74      * @param user         上线/下线   用户
 75      * @param onLine       上线  还是   下线
 76      */
 77     public static void setOnOffLineMsg(UserInfo user,boolean onLine){
 78         
 79         ArrayList<TeamInfo> teams = user.getTeams();
 80         for (TeamInfo teamInfo : teams) {
 81             ArrayList<UserInfo> users = teamInfo.getFriendList();
 82             for (UserInfo userInfo : users) {
 83                 ServerTread st =  null;
 84                 Iterator<UserInfo> other_users = stList.keySet().iterator();
 85                 while (other_users.hasNext()) {
 86                     UserInfo obj = other_users.next();
 87                     if (obj.getQq()== userInfo.getQq()) {
 88                         st = stList.get(obj);
 89                     }
 90                 }    
 91                 if(st!=null){
 92                     MsgHead msg = new MsgHead();
 93                     msg.setTotalLen(4+1+4+4);
 94                     msg.setSrc(user.getQq());
 95                     msg.setDest(userInfo.getQq());
 96                     if(onLine)
 97                         msg.setType(MsgType.command_onLine);
 98                     else
 99                         msg.setType(MsgType.command_offLine);
100                     st.sendMsg(msg);
101                 }
102             }
103         }
104         
105     }
106 
107     /**
108      * 判断消息类型   并根据类型做出不同的响应
109      * @param user        发送者
110      * @param msg        消息内容
111      */
112     public synchronized static void sendMsgToOther(UserInfo user,MsgHead msg) {
113         byte type = msg.getType();
114         switch (type) {
115         //个人信息
116         case MsgType.command_perdata:
117             MsgPerData mpd = (MsgPerData) msg;
118             int perdata_len = 4+1+4+4+10+10+1;
119             mpd.setTotalLen(perdata_len);
120             mpd.setSrc(MsgType.SERVER_QQ_NUMBER);
121             mpd.setDest(user.getQq());
122             mpd.setSex(user.getSex());
123             mpd.setIcon(user.getIcon());
124             mpd.setNickname(user.getNickname());
125             
126             stList.get(user).sendMsg(mpd);
127             break;
128         //放回好友列表
129         case MsgType.command_teamList:
130             MsgTeamList mtl = (MsgTeamList) msg;
131             int len = 4+1+4+4+4;
132             ArrayList<TeamInfo> teams = user.getTeams();
133             TeamInfo newteams = new TeamInfo("");
134             for (TeamInfo teamInfo : teams) {            
135                 int count = teamInfo.getFriendList().size();
136                 len += 10+1;
137                 len += count*(10+4+10+1+1);
138                 for (UserInfo userInfo : teamInfo.getFriendList()) {
139                     userInfo = jdbc.getUser(userInfo.getQq());
140                     
141                     Set<UserInfo> users = stList.keySet();
142                     Iterator<UserInfo> its = users.iterator();
143                     while(its.hasNext()){
144                         UserInfo userInfo2 = its.next();
145                         if(userInfo.getQq()==userInfo2.getQq()){
146                             userInfo.setOnLine((byte)0); 
147                         }
148                     }
149                     newteams.addFriend(userInfo);
150 //                    if(stList.get(userInfo)!=null)
151 //                        userInfo.setOnLine((byte)0);                //如果线程存在  则用户在线
152                 }
153             }
154             teams.clear();
155             teams.add(newteams);
156             mtl.setTotalLen(len);
157             mtl.setSrc(MsgType.SERVER_QQ_NUMBER);
158             mtl.setDest(user.getQq());
159             mtl.setTeamList(teams);
160             
161             stList.get(user).sendMsg(mtl);
162             break;
163         //查找在线的qq号
164         case MsgType.command_find:
165             ArrayList<UserInfo> frieads = user.getTeams().get(0).getFriendList();
166             ArrayList<Integer>  find_userqqs = new ArrayList<Integer>();
167             for (int i = 0; i < frieads.size(); i++) {
168                 find_userqqs.add(frieads.get(i).getQq());
169             }
170             Set<UserInfo> users = stList.keySet();
171             Iterator<UserInfo> its = users.iterator();
172             MsgFindResp mfr = new MsgFindResp();
173             mfr.setSrc(MsgType.SERVER_QQ_NUMBER);
174             mfr.setDest(user.getQq());
175             mfr.setType(MsgType.command_find_resp);
176             while(its.hasNext()){
177                 UserInfo userInfo = its.next();
178                 System.out.println(frieads.size()+"aaaaaaaaaaaaaaaa   "+frieads.contains(userInfo));
179                 if((userInfo.getQq()!=user.getQq())&&!(find_userqqs.contains(userInfo.getQq()))){
180                     mfr.addQq(userInfo);
181                 }
182             }
183             int userCount = mfr.getUsers().size();
184             mfr.setTotalLen(4+1+4+4+4+userCount*(4+10+10+1));
185             
186             stList.get(user).sendMsg(mfr);
187             break;
188         //添加好友
189         case MsgType.command_addFriend:
190             MsgAddFriend maf = (MsgAddFriend) msg;
191             MsgAddYou may = new MsgAddYou();
192             may.setTotalLen(4+1+4+4+10+30+10);
193             may.setSrc(msg.getSrc());
194             may.setDest(msg.getDest());
195             may.setType(MsgType.command_addYou);
196             may.setNickname(user.getNickname());
197             may.setNote(maf.getNote());
198             may.setSex(user.getSex());
199             
200             //System.out.println("user.getNickname():"+user.getNickname()+" user.getSex():"+user.getSex());
201             
202             //向目标用户发送请求信息
203             //stList.get(UserDao.getUserInfo(user.getQq())).sendMsg(may);
204             Iterator<UserInfo> addFriend_users = stList.keySet().iterator();
205             while (addFriend_users.hasNext()) {
206                 UserInfo obj = addFriend_users.next();
207                 if (obj.getQq()== maf.getFriendQq()) {
208                     stList.get(obj).sendMsg(may);
209                 }
210             }
211             //stList.get(jdbc.getUser(maf.getFriendQq())).sendMsg(may);
212             break;
213         //有人添加你为好友 的  回复
214         case MsgType.command_addYouResp:
215             MsgAddYouResp mayr = (MsgAddYouResp) msg;
216             MsgAddFriendResp mafr = new MsgAddFriendResp();
217             mafr.setTotalLen(4+1+4+4+1+4+10+10+1);
218             mafr.setSrc(mayr.getSrc());
219             mafr.setDest(mayr.getDest());
220             mafr.setType(MsgType.command_addFriend_Resp);
221             if(mayr.getState()==0){                //同意对方添加好友的请求
222                 mafr.setState((byte) 0);           //标记同意
223                 jdbc.addFriend(msg.getSrc(), msg.getDest());
224                 jdbc.addFriend(msg.getDest(), msg.getSrc());
225                 //UserDao.addFriend(msg.getSrc(), msg.getDest(),"","");
226                 mafr.setQq(user.getQq());
227                 mafr.setNickName(user.getNickname());
228                 mafr.setSex(user.getSex());
229                 mafr.setIcon(user.getIcon());
230                 //stList.get(jdbc.getUser(mayr.getDest())).sendMsg(mafr);     //向请求的那方  发送信息
231                 Iterator<UserInfo> addYouResp_users = stList.keySet().iterator();
232                 while (addYouResp_users.hasNext()) {
233                     UserInfo obj = addYouResp_users.next();
234                     if (obj.getQq()== mayr.getDest()) {
235                         stList.get(obj).sendMsg(mafr);
236                     }
237                 }
238                 
239                 UserInfo addYouResp_user = jdbc.getUser(mayr.getDest());
240                 mafr.setSrc(mayr.getDest());
241                 mafr.setDest(mayr.getSrc());
242                 mafr.setQq(addYouResp_user.getQq());
243                 mafr.setNickName(addYouResp_user.getNickname());
244                 mafr.setSex(addYouResp_user.getSex());
245                 mafr.setIcon(addYouResp_user.getIcon());
246                 //stList.get(user).sendMsg(mafr);                                           //向同意的那方  发送信息
247                 Iterator<UserInfo> addYouResp_users2 = stList.keySet().iterator();
248                 while (addYouResp_users2.hasNext()) {
249                     UserInfo obj = addYouResp_users2.next();
250                     if (obj.getQq()== msg.getSrc()) {
251                         stList.get(obj).sendMsg(mafr);
252                     }
253                 }
254             }else{
255                 mafr.setState((byte) 1);           //标记不同意
256                 //stList.get(jdbc.getUser(mayr.getDest())).sendMsg(mafr);
257                 Iterator<UserInfo> other_users = stList.keySet().iterator();
258                 while (other_users.hasNext()) {
259                     UserInfo obj = other_users.next();
260                     if (obj.getQq()== msg.getDest()) {
261                         stList.get(obj).sendMsg(mafr);
262                     }
263                 }
264             }
265             
266             break;
267         //震动窗口
268         case MsgType.command_vibration:
269             UserInfo vibration_user = jdbc.getUser(msg.getDest());
270             Iterator<UserInfo> vibration_users = stList.keySet().iterator();
271             while (vibration_users.hasNext()) {
272                 UserInfo obj = vibration_users.next();
273                 if (obj.getQq()== vibration_user.getQq()) {
274                     stList.get(obj).sendMsg(msg);
275                 }
276             }    
277             
278             break;
279             //发送信息  及   文件
280         case MsgType.command_chatText:
281         case MsgType.command_chatFile:
282             UserInfo chat_user = jdbc.getUser(msg.getDest());
283             Iterator<UserInfo> other_users = stList.keySet().iterator();
284             while (other_users.hasNext()) {
285                 UserInfo obj = other_users.next();
286                 if (obj.getQq()== chat_user.getQq()) {
287                     stList.get(obj).sendMsg(msg);
288                 }
289             }    
290             
291             break;
292         default:
293             break;
294         }
295     }
296     
297     /**
298      * 随机验证码的生成方法   无用
299      * @return    验证码
300      */
301     @SuppressWarnings("unused")
302     private String checkCode(){
303         String code = "";
304         Random random = new Random();
305         for (int i = 0; i < 4; i++) {
306             random.nextInt();
307             char c = (char) (random.nextInt(26)+97);
308             code += c;
309         }
310         
311         return code;
312     }
313 }
复制代码
复制代码
 1 package server;
 2 
 3 import java.net.ServerSocket;
 4 import java.net.Socket;
 5 
 6 import tools.LogTools;
 7 
 8 public class Server extends Thread {
 9 
10     private int port; // 服务器端口
11 
12     public Server(int port) {
13         this.port = port;
14     }
15 
16     @Override
17     public void run() {
18         try {
19             ServerSocket ss = new ServerSocket(port);
20             LogTools.INFO(this.getClass(), "服务器创建成功:" + port);
21             while (true) {
22                 if (Thread.interrupted()) {
23                     ServerThreadManage.removeClients();
24                     break;
25                 }
26                 Socket socket = ss.accept();
27                 if (Thread.interrupted()) {
28                     ServerThreadManage.removeClients();
29                     break;
30                 }
31                 String CAdd = socket.getLocalSocketAddress().toString();
32                 LogTools.INFO(Server.class, "进入连结:" + CAdd);
33                 ServerTread sc = new ServerTread(socket);
34                 sc.start();
35             }
36 
37         } catch (Exception e) {
38             LogTools.ERROR(this.getClass(), "服务器创建失败:" + e);
39         }
40     }
41 }
复制代码

tools包等同于上个项目的tools包

view包

复制代码
 1 package view;
 2 
 3 import java.awt.event.ActionEvent;
 4 import java.awt.event.ActionListener;
 5 
 6 import javax.swing.JButton;
 7 import javax.swing.JFrame;
 8 import javax.swing.JPanel;
 9 
10 import msg.MsgType;
11 import server.Server;
12 
13 
14 /***
15  * 服务器界面
16  * @author Administrator
17  *
18  */
19 public class ServerView extends JFrame implements ActionListener{
20 
21     private Server server;
22     private JPanel jp1;
23     private JButton start,stop;
24     
25     public static void main(String[] args) {
26         new ServerView();
27     }
28     
29     public ServerView(){
30         jp1 = new JPanel();
31         start = new JButton("启动服务器");
32         stop = new JButton("关闭服务器");
33         
34         start.addActionListener(this);
35         stop.addActionListener(this);
36         stop.setEnabled(false);
37         
38         jp1.add(start);
39         jp1.add(stop);
40         this.add(jp1);
41         
42         this.setSize(250, 80);
43         this.setVisible(true);
44         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
45     }
46 
47     @Override
48     public void actionPerformed(ActionEvent arg0) {
49         if(arg0.getSource().equals(start)){
50             start.setEnabled(false);            
51             server = new Server(MsgType.serverPort);
52             server.start();
53             stop.setEnabled(true);
54         }else if(arg0.getSource().equals(stop)){
55             start.setEnabled(true);
56             server.interrupt();
57             stop.setEnabled(false);
58         }
59     }
60 }
复制代码

复制代码
 1 package com.langsin.jdbc;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6 
 7 public class JDBC {
 8     private static String Username = "bigdata";
 9     private static String Passwd = "123";
10     private static String Url = "jdbc:oracle:thin:@192.168.3.4:1521:ORCL";// 这个背过 jdbc去掉也可以
11     private static String Driver = "oracle.jdbc.driver.OracleDriver";// 这个背过
12     private static Connection Conn = null;
13 
14     // 相当重要 代表与数据库的连接
15     public static Connection getinstance() {
16         try {
17             Class.forName(Driver);
18             Conn = DriverManager.getConnection(Url, Username, Passwd);
19             System.out.println("连接成功!!");
20         } catch (ClassNotFoundException e) {
21             // TODO Auto-generated catch block
22             e.printStackTrace();
23         } catch (SQLException e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27         return Conn;
28     }
29     public static void main(String[] args) {
30         Conn = JDBC.getinstance();
31     }
32 }
复制代码

 

posted @   518软件工程小组  阅读(429)  评论(8编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示