JAVA制作聊天室(服务器)
最近一个朋友的女儿,由于考试题目是这个(2006年1月的题目),让帮忙做个聊天室,写完后,看看代码中有线程,套接字等技术,整理下,给有需要的朋友!
/*服务器主程序(myServer.java)*/
package itbaby.jchat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class myServer
{
static ArrayList clients = new ArrayList();
static ArrayList onlineUser = new ArrayList();
static ArrayList onlineIP = new ArrayList();
public myServer()
{
}
public static void cleanupListenList()
{
/*
检查当前在线的用户数,在线程中被调用
*/
for (int i = clients.size()-1; i > -1; i--){
myServerThread client = (myServerThread) clients.get(i);
if ( ! client.isAlive() )
{
String sBye = "再见 " + (String)onlineUser.get(i);
client.kill();
clients.remove(i); //移除一个断开的线程
onlineUser.remove(i);
onlineIP.remove(i);
myServerThread.SendToAllUser();//更新在线用户
myServerThread.SendToAll(sBye);//显示再见消息
System.out.println("连接断开...");
}
}
}
public static void main( String argv[] ) throws IOException
{
ServerSocket listener = new ServerSocket(2005);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out,true);
System.out.println("Running...");
System.out.println("Port:2005");
myUserRefresh myURef = new myUserRefresh();
myURef.start();
while (true)
{
Socket client = listener.accept();//等待客户端连接
myServerThread myClientThread = new myServerThread(client); //有连接进入,开始执行一个线程
myClientThread.start();
myServer.clients.add(myClientThread); //记录有效的线程
myServer.cleanupListenList();
}
}
}
/*聊天的线程处理程序(myServerThread.java)*/
package itbaby.jchat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;
public class myServerThread extends Thread
{
private Socket Client;
boolean stillRunning = true;
public PrintWriter pout;
public myServerThread(Socket _client)
{
Client = _client;
}
public void kill()
{
stillRunning = false;
}
public static void SendToAll(String sMsg)//公聊
{
for(int i=0;i<myServer.clients.size();i++)
{
myServerThread th = (myServerThread)myServer.clients.get(i);
th.pout.println(sMsg + " ("+ th.getTime() +")");
}
}
public void SendToPrivate(String sPrivateUser,String sMsg)//私聊
{
for(int i=0;i<myServer.clients.size();i++)
{
String sIP = (String)myServer.onlineIP.get(i);
String sUs = (String)myServer.onlineUser.get(i);
String sUser = sUs + "("+sIP+")";
if(sPrivateUser.trim().equals(sUser.trim()))
{
myServerThread th = (myServerThread)myServer.clients.get(i);
th.pout.println("PrivateMessage:" +sMsg + " ("+ th.getTime() +")");
break;
}
}
}
public static void SendToAllUser()//所有在线用户列表数据
{
String sUser = "";
int iCount = myServer.clients.size();
for(int i=0;i<iCount;i++)
{
String sIP = (String)myServer.onlineIP.get(i);
String sUs = (String)myServer.onlineUser.get(i);
sUser = sUser + sUs + "(" + sIP + ")|";
}
for(int i=0;i<iCount;i++)
{
myServerThread th = (myServerThread)myServer.clients.get(i);
th.pout.println("cmd:userlist"+sUser);
}
}
public String getTime()
{
//String sTime = "";
java.text.DateFormat format1 = new java.text.SimpleDateFormat("hh:mm:ss");
java.util.Date currentTime_2 = new java.util.Date();
String sTime=format1.format(currentTime_2);
return sTime;
}
public String getClientIP()
{
return (Client.getInetAddress()).toString();
}
public void run()
{
try
{
//(Client.getInetAddress()).toString() );
InputStream in = Client.getInputStream();
InputStreamReader textIn = new InputStreamReader(in);
BufferedReader textLineIn = new BufferedReader(textIn);
OutputStream out = Client.getOutputStream();
pout = new PrintWriter(out,true);
while(stillRunning)
{
String someText = textLineIn.readLine();
if (someText.length() != 0)
{
if (someText.indexOf("cmd:welcome") != -1)
{ //欢迎消息
String sUser = someText.substring(11, someText.length());
this.SendToAll("Welcome " + sUser + " from " + this.getClientIP());
myServer.onlineIP.add(this.getClientIP());
myServer.onlineUser.add(sUser);
//发送用户列表数据
myServerThread.SendToAllUser();
}
else if (someText.indexOf("sendto:") != -1)
{ //私聊
String sUser = someText.substring(7, someText.indexOf(")") + 1);
someText = someText.substring(someText.indexOf(")") + 1,
someText.length());
pout.println("PrivateMessage:" + someText + " (" + this.getTime() + ")"); //自己发送的,自己回显聊天语句
this.SendToPrivate(sUser, someText); //接受人,显示聊天语句
}
else myServerThread.SendToAll(someText); //发送公共聊天消息
}
}
}
catch (IOException e)
{
System.out.println( "I/O Error They probably left " + e);
}
}
}
/*刷新用户*/
package itbaby.jchat;
public class myUserRefresh extends Thread
{
public myUserRefresh() {
}
public void run()
{
while(true)
{
myServer.cleanupListenList();
}
}
}