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

📄 icqserver.java

📁 实现简单的群聊功能
💻 JAVA
字号:
package cn.edu.buaa.scse.liyi.network.server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;

import cn.edu.buaa.scse.liyi.network.hibernate.bean.Messages;
import cn.edu.buaa.scse.liyi.network.hibernate.bean.User;
import cn.edu.buaa.scse.liyi.network.hibernate.dao.MessagesDAO;
import cn.edu.buaa.scse.liyi.network.hibernate.dao.UserDAO;

public class ICQServer
{
	List<User> ulist=new ArrayList<User>();
	
	public void startServer()
	{
		ServerSocket server=null;
		Socket socket=null;
		Hashtable<String,ServerThread> list;									//存放与各聊天者客户端通信的服务器线程的散列表
		
		list=new Hashtable<String,ServerThread>();
		while(true)
		{
			try
			{
				server=new ServerSocket(9090);
			}
			catch(IOException e)
			{
				System.out.println("正在监听...");
			}
			try
			{
				socket=server.accept();					//建立和客户端的连接的套接字
				InetAddress address=socket.getInetAddress();
				System.out.println("用户的IP:"+address);
			}	
			catch(IOException e)
			{
			}
			if(socket!=null)
			{
				ServerThread thread=new ServerThread(socket,list);
				thread.start();							//与该客户端通信的服务器,开始启动线程
			}	
			else
			{
				continue;
			}
		}
	}
	
	public List<User> getOnlineList()
	{
		return this.ulist;
	}
	
	class ServerThread extends Thread
	{
		Socket socket=null;
		File file=null;
		DataOutputStream out=null;
		DataInputStream in=null;
		Hashtable<String,ServerThread> list=null;
		String userid,username,ip;
		
		public ServerThread(Socket socket,Hashtable<String,ServerThread> list)
		{
			this.socket=socket;
			this.list=list;
			try
			{
				in=new DataInputStream(socket.getInputStream());
				out=new DataOutputStream(socket.getOutputStream());
			}
			catch(IOException e)
			{
				e.printStackTrace();
			}	
		}
		
		public void run()
		{
			MessagesDAO mDao=new MessagesDAO();
			
			while(true)
			{
				String str;
				
				try
				{
					str=in.readUTF();
					
					if(str.startsWith("userid:"))
					{
						userid=str.substring(str.indexOf("userid:")+"userid:".length(),str.indexOf(";username:"));
						username=str.substring(str.indexOf("username:")+"username:".length(),str.indexOf(";ip:"));
						ip=str.substring(str.lastIndexOf("ip:")+"ip:".length());
						ulist.add(new User(userid,username,"",ip,""));
						list.put(userid,this);
						Enumeration<ServerThread> enum0=list.elements();
						while(enum0.hasMoreElements())
						{
							((ServerThread)enum0.nextElement()).out.writeUTF("userid:"+userid+";username:"+username+";ip:"+ip);
						}
						for(int i=0;i<ulist.size();i++)
						{
							if(!userid.equals(ulist.get(i).getUserid()))
								out.writeUTF("userid:"+ulist.get(i).getUserid()+";username:"+ulist.get(i).getUsername()+";ip:"+ulist.get(i).getIp());
						}
						
						UserDAO uDao=new UserDAO();
						if(uDao.getUser(userid)==null)
						{
							uDao.addUser(new User(userid,username,"",ip,""));
						}
						uDao.getSession().close();
					}
					else if(str.startsWith("message:"))
					{
						String msg=str.substring(str.indexOf("message:")+"message:".length(),str.lastIndexOf("userid:"));
						String sender=str.substring(str.lastIndexOf("userid:")+"userid:".length());
						mDao.addMessages(new Messages(sender,"",new Date(),msg));
					
						Enumeration<ServerThread> enum0=list.elements();
						
						while(enum0.hasMoreElements())
						{
							((ServerThread)enum0.nextElement()).out.writeUTF("message:"+msg);
						}
					}
					else if(str.startsWith("file:"))
					{
						String receiver=str.substring(str.lastIndexOf(";receiver:")+";receiver:".length());
						((ServerThread)list.get(receiver)).out.writeUTF(str.substring(0,str.lastIndexOf(";")));

						byte[] buf=new byte[1024*1024];
						int len=0;
						if(in!=null)
						{
							len=in.read(buf);
						}
						
						((ServerThread)list.get(receiver)).out.write(buf,0,len);
						((ServerThread)list.get(receiver)).out.flush();
					}
				}
				catch(IOException e)
				{
					// TODO Auto-generated catch block
					if(userid!=null)
						list.remove(userid);
					try
					{
						socket.close();
					}
					catch(IOException e1)
					{
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					break;
				}
			}
			
			mDao.getSession().close();
		}
	}
}

⌨️ 快捷键说明

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