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

📄 qqserver.java

📁 实现多人聊天以及私聊和传文件功能 类似于
💻 JAVA
字号:
package NewQQ;

/*
 * ---------------------------------------------------------------------
 * 自定义QQ聊天系统
 * 服务器                      
 * ---------------------------------------------------------------------
 * 所有数据统一用自定义数据类型QQMessage发送
 */

import java.net.*;
import java.io.*;
import java.util.*;

public class QQServer {
	public static void main(String[] args) throws Exception{
		ServerSocket serversocket = new ServerSocket(14789);
		HashMap<String,Socket> user = new HashMap<String,Socket>();
		HashMap<String,ObjectOutputStream> userout = new HashMap<String,ObjectOutputStream> ();
		while(true){
			Socket clientsocket = serversocket.accept();
			QQServerThread clientthread = new QQServerThread(clientsocket,user,userout);
			clientthread.start();
		}
	}
}

class QQServerThread extends Thread{
	Socket clientsocket;
	HashMap<String,Socket> user;
	HashMap<String,ObjectOutputStream> userout;
	Set<String> username;
	Iterator it;
	String name;
	public QQServerThread(Socket clientsocket, HashMap<String,Socket> user,HashMap<String,ObjectOutputStream> userout) {
		this.clientsocket = clientsocket;
		this.user = user;
		this.userout = userout;
	}
	public void run(){
		try {
			QQMessage sendmessage = new QQMessage();//用于发送信息
			//输出流
			ObjectOutputStream sendmsg = new ObjectOutputStream(clientsocket.getOutputStream());
			//输入流
			ObjectInputStream recvmsg = new ObjectInputStream(clientsocket.getInputStream());
			//1.判断用户名是否存在,并返回结果
			QQMessage recvmessage = (QQMessage)recvmsg.readObject();
			name = recvmessage.getSender();
			username = user.keySet();
				//1.1用户名已经存在,反馈,程序结束
				if(username.contains(name)){
					sendmessage.setMessage("false");
					sendmsg.writeObject(sendmessage);
					sendmsg.flush();
					return;
				}
				else{
				//1.2用户名可以使用
					//1.2.1反馈
					sendmessage.setMessage("true");
					sendmsg.writeObject(sendmessage);
					sendmsg.flush();
					it = username.iterator();
					while(it.hasNext()){
						String tempstring = (String)it.next();
						Socket recvsocket = user.get(tempstring);
					//1.2.2向各在线用户发送该用户
						QQMessage sendadd = new QQMessage();
						sendadd.setType(1);
						sendadd.setSender(name);
						ObjectOutputStream oos = userout.get(tempstring);
						oos.writeObject(sendadd);
						oos.flush();
					//1.2.3向该用户发送在线用户名字
						QQMessage sendonline = new QQMessage();
						sendonline.setType(2);
						sendonline.setSender(tempstring);
						sendmsg.writeObject(sendonline);
						sendmsg.flush();
					}
					//1.2.4添加到在线用户列表
					user.put(name,clientsocket);
					userout.put(name,sendmsg);
		
			//2.循环接收信息
					while(true){
						QQMessage mrecvmessage = (QQMessage) recvmsg.readObject();
						int type = mrecvmessage.getType();
						if(mrecvmessage  == null || type == 6)
							break;
						if(type==3){//发给所有人的
							username = user.keySet();
							it = username.iterator();
							while(it.hasNext()){
								String tempstring = (String)it.next();
								Socket recvsocket = user.get(tempstring);
								ObjectOutputStream oos = userout.get(tempstring);
								oos.writeObject(mrecvmessage);
								oos.flush();
							}
						}
						else{//发给单个人
							Socket recvsocket = user.get(mrecvmessage.getRecver());
							ObjectOutputStream oos = userout.get(mrecvmessage.getRecver());
							oos.writeObject(mrecvmessage);
							oos.flush();
						}
					}
		
			//3.删除user列表中该用户,并断开与其连接,通知其他所有用户该用户下线
					user.remove(name);
					userout.remove(name);
					username = user.keySet();
					it = username.iterator();
					while(it.hasNext()){
						QQMessage senddel = new QQMessage();
						String tempstring = (String)it.next();
						Socket recvsocket = user.get(tempstring);
						senddel.setType(7);
						senddel.setSender(name);
						ObjectOutputStream oos = userout.get(tempstring);
						oos.writeObject(senddel);
						oos.flush();
					}
				}
		} catch (Exception e) {}
	}
}

⌨️ 快捷键说明

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