⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverusermanager.java

📁 一个采用Java Socket编程实现的QQ软件
💻 JAVA
字号:
package serverwork;

import java.util.*;import java.net.*;
import java.io.*;
public class ServerUserManager extends Thread {
    
    private Server owner;  
    private DatagramSocket quitSock;
    public ServerUserManager(Server owner) {
        this.owner = owner;
    }
    
    public void sendFriendsList(Socket sock, String[] friends,String username){         //向上线用户发送该用户的好友列表
        String onlineFriends = "";
        String downlineFriends = "";
        String group = "";
        for(int i=0; i<friends.length; i++){
            if(owner.getonlineuser().containsKey(friends[i])){
                onlineFriends += friends[i]+ "/" + owner.getonlineuser().get(friends[i])+",";    
                           }else{
                downlineFriends += friends[i]+",";
                           }          
        }       
        if(owner.getgroup1().containsKey(username)){
            owner.getgroup1().remove(username);
            owner.getgroup1().put(username,"2");
            group = group + "1111"+"/";
        }
        if(owner.getgroup2().containsKey(username)){
            owner.getgroup2().remove(username);
            owner.getgroup2().put(username,"2");
            group = group + "2222"+"/";
        }
        
        try {
            DataOutputStream out = new DataOutputStream(sock.getOutputStream());
            System.out.println("在线好友:"+onlineFriends);            
            out.writeUTF("在线好友:"+onlineFriends);               //发送上线好友列表的方法
            System.out.println("离线好友:"+downlineFriends);
            out.writeUTF("离线好友:"+downlineFriends);             //发送离线好友列表的方法
            System.out.println("群组:"+group);
            out.writeUTF("群组:"+group);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    public void noticeOtherFriends(Socket sock, String username, String[] friends){             //通知用户的好友,该用户以上线
        for(int i=0; i<friends.length; i++)
            if(owner.getonlineuser().containsKey(friends[i])){
            String message = null;
            message = "好友上线:" + username + "," + sock.getInetAddress().toString().substring(1,sock.getInetAddress().toString().length()) + "/" + sock.getPort();
            sentdata(friends[i],message);
            }         
    }
     
    public void noticeFriendsdownline(String username){
        String[] friend = owner.dataservice.getallfriends(username);  
        for(int i=0; i<friend.length; i++)
            if(owner.getonlineuser().containsKey(friend[i])){
            String message = null;
            message = "好友离线:"+username;
            sentdata(friend[i],message);
            }
    }
    
    public synchronized void addOnlineUser(Socket sock, String username){//添加上线用户(在服务器上添加)
        String sr =  sock.getInetAddress().toString();
        String sockStr = sr.substring(1,sr.length())+"/"+sock.getPort();
        String message = owner.getdownlinuser().get(username);    
        owner.addonlineuser(username, sockStr);
        owner.servergui.onlineuser(username,sockStr);  
        if(!message.equals("")){            
            sentdata(username,"通知:"+message);
        }
    }
    
    public void clear(){
        owner.getonlineuser().clear();
    }
    
    public void terminate(){
        if(quitSock != null) quitSock.close();
    }
    
    public void run(){
        boolean done = false;
        while(!done){
            try {
                quitSock = new DatagramSocket(5748);               
                byte[] buff = new byte[64];
                DatagramPacket packet = new DatagramPacket(buff, buff.length);
                quitSock.receive(packet);
                System.out.println("收到客户端的数据包");
                String usermessage = new String(packet.getData()).trim();
                dealmassage(usermessage);
                //onlineUser.remove(uid);
            } catch (SocketException ex) {
                done = true;
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                if(quitSock != null) quitSock.close();
            }
        }
    } 
    public void dealmassage(String user){
        System.out.println("接收到的内容为:"+user);       
        if(user.startsWith("添加好友:")){	
            String message = user.substring(user.indexOf(":")+1,user.length());
            String[] st = message.split(",");
            System.out.println("源:"+st[0]+"目标:"+st[1]);
            Vector online = owner.getvectoronline();
            boolean state = false;
            for(int i =0; i < online.size(); i++){
                if(st[1].equals((String)online.get(i))){
                    state = true;
                    break;
                }
            }
            if(state){
                if(owner.ser.getData().updateuserfriends(st[0],st[1])){
                    sentdata(st[0],"加好友:success");
                    System.out.println("以为客户机发送了数据包");
                }
            }else{
                sentdata(st[0],"加好友:该好友不在线,不能添加");
            }	
        }
        if(user.startsWith("获取群组:")){
            String st = null;
            String message = user.substring(user.indexOf(":")+1);
            String[] messages = message.split("/");
            if(messages[1].equals("1111")){
                for(int i = 0; i < owner.group11.size(); i++){
                    st = st + "," + owner.group11.get(i);
                }
                st = "1111:" + st;
                this.sentdata(messages[0],st);
            }
            if(messages[1].equals("2222")){
                if(messages[1].equals("2222")){
                    for(int i = 0; i < owner.group11.size(); i++){
                        st = st + "," + owner.group11.get(i);
                    }
                    st = "2222:" + st;
                    this.sentdata(messages[0],st);
                }
            }
        }
        if(user.startsWith("离线:")){                        
            String username = user.substring(user.indexOf(":")+1,user.length());
            System.out.println("用户:"+username+"离线");
            noticeFriendsdownline(username);
            owner.servergui.downlineuser(username);
            owner.adddownlineuser(username);
        }
        if(user.startsWith("加入群组:")){
            String messag = user.substring(user.indexOf(":")+1,user.length());
            String[] messags = messag.split("/");
            String username = messags[0];
            String group = messags[1];
            if(group.equals("1111")){
                if(owner.getgroup1().containsKey(username)){
                    System.out.println("此群组已存在");  
                    this.sentdata(username,"加入群组:此群组已存在");
                    //发送数据
                }else{
                    owner.getgroup1().put(username,"2");
                    String st1 = owner.dataservice.getallgroup(username);   
                    st1 = st1 +",1111";
                    owner.dataservice.updateusergroups(username,st1);
                    this.sentdata(username,"加入群组:1111");
                }
            }else if(group.equals("2222")){
                if(owner.getgroup2().containsKey(username)){
                    System.out.println("此群组已存在");  
                    this.sentdata(username,"加入群组:此群组已存在");
                    //发送数据
                }else{
                    owner.getgroup2().put(username,"2");
                    String st1 = owner.dataservice.getallgroup(username);   
                    st1 = st1 +",2222";
                    owner.dataservice.updateusergroups(username,st1);
                    this.sentdata(username,"加入群组:2222");
                }
            }else{
                System.out.println("该群组不存在");
                this.sentdata(username,"加入群组:此群组在服务器中不存在");
            }
        }        
    }
    
    public void sentdata(String username,String content){
        DatagramSocket noticeSock;     
        String address = owner.getonlineuser().get(username);
        
        if(!address.equals("")){    	String friendIp = address.split("/")[0];
        int friendPort = Integer.parseInt(address.split("/")[1]);
        System.out.println("发送到端口:"+friendPort);
        try {
            noticeSock = new DatagramSocket();
            byte[] buff = content.getBytes();
            DatagramPacket packet;
            packet = new DatagramPacket(buff, buff.length, 
                    InetAddress.getByName(friendIp), friendPort);			
            noticeSock.send(packet);
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("发送数据报失败");
        }
        }
    }
      
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -