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

📄 chatserver.java

📁 一个小的聊天室程序,用java socket编写,允许多个客户端和一个服务端,默认是一个客户和一个服务端.
💻 JAVA
字号:
import java.net.*; 
import java.io.*; 
import java.util.*; 

public class ChatServer{ 
//聊天室管理员ID 
protected final static String CHATMASTER_ID="ChatMaster"; 
//系统信息的分隔符 
protected final static String SEP=": "; 
//服务器的Socket 
protected ServerSocket servSock; 
//当前客户端列表 
protected ArrayList clients; 
//调试标记 
protected boolean DEBUG=false; 
public ChatParameter Chat; 

//主方法构造一个ChatServer,没有返回值 
public static void main(String[] argv){ 
System.out.println("Chat server0.1 starting>>>>>>>>>>>>>>>>"); 
ChatServer w=new ChatServer(); 
w.runServer(); 
System.out.println("***ERROR*** Chat server0.1 quitting"); 

} 


//构造和运行一个聊天服务 
ChatServer(){ 
Chat=new ChatParameter(); 
clients=new ArrayList(); 
try{ 
servSock=new ServerSocket(7777);//实有问题拉,不过可能是他自己定义既一个class. 
System.out.println("Chat Server0.1 listening on port:"+7777); 
}catch(Exception e){ 
log("IO Exception in ChatServer.<init>"); 
System.exit(0); 
} 
} 

public void runServer(){ 
try{ 
while(true){ 
Socket us=servSock.accept(); 
String hostName=us.getInetAddress().getHostName(); 
System.out.println("Accpeted from "+hostName); 
//一个处理的线程 
ChatHandler cl=new ChatHandler(us,hostName); 
synchronized(clients){ 
clients.add(cl); 
cl.start(); 
if(clients.size()==1) 
cl.send(CHATMASTER_ID,"Welcome!You are the first one here"); 
else{ 
cl.send(CHATMASTER_ID,"Welcome!You are the latest of"+ 
clients.size()+" users."); 
} 
} 
} 
}catch(Exception e){ 
log("IO Exception in runServer:"+e); 
System.exit(0); 
} 
} 


protected void log(String s){ 
System.out.println(s); 
} 


//处理会话的内部的类 
protected class ChatHandler extends Thread { 
//客户端scoket 
protected Socket clientSock; 
//读取socket的BufferedReader 
protected BufferedReader is ; 
//在socket 上发送信息行的PrintWriter 
protected PrintWriter pw; 
//客户端出主机 
protected String clientIP; 
//句柄 
protected String login; 

public ChatHandler (Socket sock,String clnt)throws IOException { 
clientSock=sock; 
clientIP=clnt; 
is=new BufferedReader( 
new InputStreamReader(sock.getInputStream())); 
pw=new PrintWriter (sock.getOutputStream(),true); 

} 

//每一个ChatHandler是一个线程,下面的是他的run()方法 
//用于处理会话 
public void run(){ 
String line; 

try{ 
while((line=is.readLine())!=null){ 
char c=line.charAt(0);//我顶你老母啊 ,果只Chat.CMD咩xx冇定义 扑啊///!!! 
line=line.substring(1); 
switch(c){ 
//case Chat.CMD_LOGIN: 
case 'l': 
if(!Chat.isValidLoginName(line)){ 
send(CHATMASTER_ID,"LOGIN"+line+"invalid"); 
log("LOGIN INVALID from:"+clientIP); 
continue; 
} 

login=line; 
broadcast(CHATMASTER_ID,login+" joins us,for a total of"+ 
clients.size()+" users"); 
break; 

// case Chat.CMD_MESG: 
case 'm': 
if(login==null){ 
send(CHATMASTER_ID,"please login first"); 
continue; 
} 

int where =line.indexOf(Chat.SEPARATOR); 
String recip=line.substring(0,where); 
String mesg=line.substring (where+1); 
log("MESG: "+login+"--->"+recip+": "+mesg); 
ChatHandler cl=lookup(recip); 
if(cl==null) 
psend(CHATMASTER_ID,recip+"not logged in."); 
else 
cl.psend(login,mesg); 

break; 


//case Chat.CMD_QUIT: 
case 'q': 
broadcast(CHATMASTER_ID,"Goodbye to "+login+"@"+clientIP); 
close(); 
return;//ChatHandler结束 


// case Chat.CMD_BCAST: 
case 'b': 
if(login!=null) 
broadcast(login,line); 
else 
log("B<L FROM"+clientIP); 
break; 

default: 
log("Unknow cmd"+c+"from"+login+"@"+clientIP); 
} 
} 
}catch(IOException e){ 
log("IO Exception :"+e); 
}finally{ 
//sock 结束,我们完成了 
//还不能发送再见的消息 
//得有简单的基于命令的协议才行 
System.out.println(login+SEP+"All Done"); 
synchronized(clients){ 
clients.remove(this); 
if(clients.size()==0){ 
System.out.println(CHATMASTER_ID+SEP+ 
"I'm so lonely I could cry>>>>>"); 
}else if(clients.size()==1){ 
ChatHandler last=(ChatHandler)clients.get(0); 
last.send(CHATMASTER_ID,"Hey,you are talking to yourself again"); 
} 
else{ 
broadcast(CHATMASTER_ID,"There are now"+clients.size()+" users"); 
} 
} 
} 
} 
protected void close(){ 
if(clientSock==null){ 
log("close when not open"); 
return; 
} 
try{ 
clientSock.close(); 
clientSock=null; 
}catch(IOException e){ 
log("Failure during close to "+clientIP); 
} 
} 
//发送一条消息给用户 
public void send(String sender,String mesg){ 
pw.println(sender+SEP+"*>"+mesg); 
} 
//发送私有的消息 
protected void psend(String sender ,String msg){ 
send("<*"+sender+"*>",msg); 
} 
//发送一条消息给所有的用户 
public void broadcast (String sender,String mesg){ 
System.out.println("Broadcasting"+sender+SEP+mesg); 
for(int i=0;i<clients.size();i++){ 
ChatHandler sib=(ChatHandler)clients.get(i); 
if(DEBUG) 
System.out.println("Sending to"+sib); 
sib.send(sender,mesg); 
} 
if(DEBUG) System.out.println("Done broadcast"); 
} 
protected ChatHandler lookup(String nick){ 
synchronized(clients){ 
for(int i=0;i<clients.size();i++){ 
ChatHandler cl=(ChatHandler)clients.get(i); 
if(cl.login.equals(nick)) 
return cl; 
} 
} 
return null; 
} 
//将ChatHandler对象转换成一个字符串 
public String toString(){ 
return "ChatHandler["+login+"]"; 
} 
} 
} 

class ChatParameter { 
public static final char CMD_BCAST='b'; 
public static final char CMD_LOGIN='l'; 
public static final char CMD_MESG='m'; 
public static final char CMD_QUIT='q'; 
public static final char SEPARATOR=':';//????? 
public static final int PORTNUM=7777; 
public boolean isValidLoginName(String line){ 
if (line.equals("CHATMASTER_ID")) 
return false; 
return true; 
} 
public void main(String[] argv){ 
} 
}

⌨️ 快捷键说明

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