import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Scanner;
/**
*
*<br>
* æœåŠ¡å™¨çš„å®žçŽ°æ•ˆæžœåQ?<br>
*<br>
* 1.输入-help得到所有有å…ÏxœåС噍æ“作的命ä»?<br>
*<br>
* 2.输入-run˜q›å…¥æœåС噍儙å¹å†…容åˆå§‹åŒ– <br>
*<br>
* 3.输入-stopæ–å¼€æœåŠ¡å™?<br>
*<br>
* 4.输入-quitæ–å¼€æœåŠ¡å™¨ï¼Œòq‰™€€å‡ºæ“ä½?<br>
*<br>
* 5.æœåŠ¡å™¨åˆ›å»ºæˆåŠŸåŽåQŒä¼š(x¨¬)通过å•独的线½E‹è¿è¡Œç›‘å¬å®¢æˆïL(f¨¥ng)«¯ä¿¡æ¯(listenLink) <br>
*<br>
* 6.æœåŠ¡å™¨æŽ¥æ”¶åˆ°æ•°æ®åŽï¼Œä¼?x¨¬)将数殿UÖMº¤è‡Ïx•°æ®åˆ†æžå™¨(analyseMes)å¤„ç† <br>
*<br>
* 7.当用æˆïL(f¨¥ng)¡®å®šè¿žæŽ¥åƈ¼‹®å®šæ˜ëЧ°åŽï¼ŒæœåŠ¡å™¨å°†è¯¥ç”¨æˆïL(f¨¥ng)š„地å€å?qi¨¢ng)å§“åå˜å‚¨åœ¨infoMemoryä¸ã€?<br>
*<br>
*<br>
*<br>
*<br>
* æœåŠ¡å™¨çš„¾cÖM¸Žæ–ÒŽ(gu¨©)³•åQ?<br>
*<br>
* 1.‹¹‹è¯•æœåŠ¡å™¨åˆ›å»ºï¼š(x¨¬)testServer(String ip,int port) <br>
*<br>
* 2.åˆå§‹åŒ–æœåС噍 åQšinitServer(String ip,int port) <br>
*<br>
* 3.¼‹®å®šIP与Port åQšfixServerLink(String ip,int port) <br>
*<br>
* 4.ä¿¡æ¯ç›‘å¬å™?åQšlistenLink() <br>
*<br>
* 5.æ•°æ®åˆ†æžå™?åQšanalyseMes(String mes) <br>
*<br>
* 6.获å–地å€ç”¨æˆ·å:(x¨¬)getConsumerName(SocketAddress sa) <br>
*<br>
* 7.æ•°æ®è½¬å‘å™?åQštransforMes(String mes) <br>
*<br>
* 8.æ•°æ®å•项转å‘器:(x¨¬)transforMesSingle(SocketAddress adr,String mes) <br>
*<br>
* 9.åœæ¢æœåŠ¡å™?åQšcutServer() <br>
*<br>
* 10.获得帮助列表 åQšhelpList() <br>
*<br>
* 11.错误æç¤ºæ–ÒŽ(gu¨©)³• åQšerrorTip(String str) <br>
*<br>
* 12.在主函数ä¸è¿›è¡Œç›¸åº”æ“ä½?<br>
*<br>
*<br>
* é‡ç‚¹æ³¨æ„的地方:(x¨¬) <br>
*<br>
* 与客æˆïL(f¨¥ng)«¯ç›æ€»¿åQŒäØ“(f¨´)äº?ji¨£n)顺利监å¬ä¿¡æ¯ï¼Œéœ€è¦å¦ä¸€ä¸ªçº¿½E‹è¿è¡Œä¿¡æ¯ç›‘å¬å™¨
*
*/
public class ChatServer implements Runnable
{
private DatagramSocket server = null;
private DatagramPacket getDatas = null;
private InetAddress serverAddress = null;
private int port = 0;
// 开始è¿è¡Œç›‘å¬çš„å˜é‡
private boolean beStart = false;
// 用楋¹‹è¯•æœåŠ¡å™¨çš„å˜é‡
private boolean test = true;
// ä¿¡æ¯å˜å‚¨å™?br /> private Hashtable<String, SocketAddress> infoMemory = new Hashtable<String, SocketAddress>();
/**
* ‹¹‹è¯•æœåŠ¡å™¨è¿žæŽ?br /> *
* @param ip
* @param port
* @return
*/
public boolean testServer(String ip, int port)
{
this.initServer(ip, port);
return test;
}
/**
* æœåС噍åˆå§‹åŒ–
*
* @param ip
* @param port
*/
public void initServer(String ip, int port)
{
// ¼‹®å®šIP与port输入æ£ç¡®
this.fixServerLink(ip, port);
try
{
server = new DatagramSocket(this.port, serverAddress);
System.out.println("!-The Server Initialization SuccessåQ?);
// å¯ä»¥å¼€å§‹è¿è¡Œå˜é‡?br /> beStart = true;
}
catch (SocketException s)
{
// 如果出现异常åQŒåˆ™æœåŠ¡å™¨æµ‹è¯•ä¸é€šè¿‡
test = false;
errorTip("!-The Server Initialization Fail!");
}
finally
{
}
}
/**
* ¼‹®å®šæœåС噍IP和端å£ä¿¡æ?br /> *
* @param ip
* @param port
*/
private void fixServerLink(String ip, int port)
{
// 判斘qžæŽ¥æœåŠ¡å™¨çš„ç«¯å£å?br /> // 如果输入命ä×o(h¨´)ä¸?åQŒåˆ™ä¸ºé»˜è®¤ç«¯å£å·9999
// å¦åˆ™ç«¯å£å·äØ“(f¨´)新端å£å·
if (port == 0)
this.port = 9999;
else
this.port = port;
// 判斘qžæŽ¥æœåŠ¡å™¨çš„IP地å€
// 如果输入命ä×o(h¨´)ä¸?åQŒåˆ™ä¸ºé»˜è®¤çš„æœ¬åœ°IP地å€
// å¦åˆ™ä¸ø™¾“入的IP地å€
try
{
if (ip.equalsIgnoreCase("0"))
this.serverAddress = InetAddress.getLocalHost();
else
this.serverAddress = InetAddress.getByName(ip);
}
catch (UnknownHostException u)
{
errorTip("!-Sorry, IP address you put is not currect!");
}
}
/**
* 监å¬ä¿¡æ¯
*
*/
public void listenLink()
{
byte[] buf = new byte[1024];
String mes = null;
try
{
getDatas = new DatagramPacket(buf, buf.length);
System.out.println("!-The Server starts listenning to message.");
while (beStart)
{
server.receive(getDatas);
mes = new String(buf, 0, getDatas.getLength());
// ž®†èŽ·å–的数æ®ä¼ 递至数æ®åˆ†æžå™?br /> this.analyseMes(mes);
}
}
catch (IOException e)
{
errorTip("!-The Server Can not receive message");
}
}
/**
* æ•°æ®åˆ†æžå™¨ï¼Œ¾l™äºˆç›¸åº”处ç†
*
* @param mes
*/
private void analyseMes(String mes)
{
// 获å–当å‰å®¢æˆ·ç«¯çš„地å€åQ?br /> SocketAddress adr = getDatas.getSocketAddress();
// -test:˜q›è¡ŒæœåŠ¡å™¨ä¸Žå®¢æˆ·ç«¯çš„˜qžæŽ¥‹¹‹è¯•
// è‹¥æˆåŠŸï¼Œåˆ™å°†è¯¥å®¢æˆïL(f¨¥ng)«¯å‘逿ˆåŠŸæ¶ˆæ?br /> if (mes.trim().equalsIgnoreCase("-test"))
{
transforMesSingle(adr, "-test: !-From Server:Succeed in Testing.");
}
// -quitåQšæŽ¥å—客æˆïL(f¨¥ng)«¯é€€å‡ÞZ¿¡æ?br /> // ž®†è¯¥ç”¨æˆ·çš„退å‡ÞZ¿¡æ¯è{å‘至所有在¾U¿æˆå‘?br /> else if (mes.trim().equalsIgnoreCase("-quit"))
{
String name = this.getConsumerName(adr);
System.out.println(name + "http://" + adr + " quit! ");
transforMes("* " + name + "退å‡?gu¨®)™Šå¤©å®?);
infoMemory.remove(name);
}
// -getList:接å—客户端获å–列表的è¯äh±‚
// ž®†æ‰€æœ‰ç”¨æˆ¯‚¿žæŽ¥äØ“(f¨´)å—符串的形å¼åQŒå¦‚åQ?-getList,用户1,用户2...用户n"
else if (mes.trim().equals("-getList"))
{
StringBuffer list = new StringBuffer();
list.append("-getList,");
Enumeration<String> names = infoMemory.keys();
while (names.hasMoreElements())
{
list.append(names.nextElement() + ",");
}
transforMesSingle(getDatas.getSocketAddress(), list.toString());
}
// -toåQšæŽ¥å—客æˆïL(f¨¥ng)«¯è¯äh±‚åQŒå°†ä¿¡æ¯è½¬å‘¾l™ç›¸åº”客æˆ?br /> // å¦‚æžœç›®æ ‡å®¢æˆ·ä¸å˜åœ¨ï¼Œåˆ™å‘è¯äh±‚客户å‘é€ç›¸åº”消æ?br /> else if (mes.indexOf("-to ") != -1 && mes.startsWith("-to "))
{
String main = mes.substring("-to ".length(), mes.length());
String toName = main.substring(0, main.indexOf(" "));
String name = this.getConsumerName(adr);
String con = name + " say to you :" + main.substring(toName.length() + 1, main.length());
if (!infoMemory.containsKey(toName))
transforMesSingle(adr, "!-The message can not be recevie by whom you send for,please check out.");
else
transforMesSingle(infoMemory.get(toName), con);
}
// -nick:接å—客户端登录请æ±?br /> // 如果输入的匿åä¸å˜åœ¨åQŒåˆ™ç™»è®°è¯¥ç”¨æˆ·ä¸ŽinfoMemory
// 如果å˜åœ¨åˆ™è¿”回相应æ½C?br /> else if (mes.indexOf("-nick ") != -1 && mes.startsWith("-nick "))
{
String nickName = mes.substring("-nick ".length(), mes.length());
if (infoMemory.containsKey(nickName))
transforMesSingle(adr, "-nick: !-The nickname you post is already exist,please try others.");
else
{
infoMemory.put(nickName, adr);
transforMes("Welcome " + nickName + " to Sunspot Chat!");
System.out.println(nickName + "http://" + adr.toString() + " succeed in lanuching.");
}
}
// 一般消æ¯å°†ä¼?x¨¬)è{å‘至所有用æˆ?br /> else
{
String name = this.getConsumerName(adr);
transforMes(name + ": " + mes);
}
}
/**
* 通过地å€å¾—到用户的昵¿U?ç”׃ºŽHashtableæ— æ³•é€šè¿‡Value获å–KeyåQŒæ‰€æœ‰ä¸“门写该方æ³?br /> *
* @param sa
* @return
*/
private String getConsumerName(SocketAddress sa)
{
Enumeration<String> names = infoMemory.keys();
String name = null;
while (names.hasMoreElements())
{
String temp = names.nextElement();
SocketAddress adrs = infoMemory.get(temp);
// ˜q›è¡Œæ¯”较
if (sa.equals(adrs))
{
name = temp;
break;
}
}
return name;
}
/**
* 呿‰€æœ‰çš„用户å‘逿•°æ?br /> *
* @param mes
*/
public void transforMes(String mes)
{
byte[] buf = mes.getBytes();
DatagramPacket sendDatas = null;
Enumeration<SocketAddress> all = infoMemory.elements();
try
{
while (all.hasMoreElements())
{
sendDatas = new DatagramPacket(buf, buf.length, all.nextElement());
server.send(sendDatas);
}
}
catch (SocketException s)
{
errorTip("!-The feedback address is error!");
}
catch (IOException i)
{
errorTip("!-Can not send message!");
}
}
/**
* å‘å•个用户å‘逿•°æ?br /> *
* @param adr
* @param mes
*/
public void transforMesSingle(SocketAddress adr, String mes)
{
byte[] buf = mes.getBytes();
try
{
DatagramPacket sendDatas = new DatagramPacket(buf, buf.length, adr);
server.send(sendDatas);
}
catch (SocketException s)
{
errorTip("!-The feedback address is error!");
}
catch (IOException i)
{
errorTip("!-Can not send message!");
}
}
/**
* æ–å¼€˜qžæŽ¥
*
*/
public void cutServer()
{
beStart = false;
if (server != null)
server.close();
System.out.println("!-The server is done.");
}
public void helpList()
{
System.out.println("-help" + " èŽ·å–æœåŠ¡å™¨ç›¸åº”æ“作的帮助" + "\n" + "-run " + " ˜q行æœåŠ¡å™¨ï¼Œòq¶åŒæ—¶å¾ç«‹ä¿¡æ¯ç›‘å? + "\n" + "-stop"
+ " åœæ¢æœåŠ¡å™? + "\n" + "-quit" + " åœæ¢æœåŠ¡å™¨ï¼Œòq‰™€€å‡ºå‘½ä»? + "\n");
}
/**
* ¾U¿ç¨‹
*/
public void run()
{
listenLink();
}
/**
* ä¸»è¦æ“作
*
* @param args
*/
public static void main(String[] args)
{
ChatServer ser = new ChatServer();
String getIp = null;
int getPort = 0;
// 建立输入
Scanner input = new Scanner(System.in);
System.out.println("!-Please input server command:");
// 开始输�br /> String command = null;
// 如果输入quitž®†æ–å¼€˜qžæŽ¥åQŒåƈ退出æ“ä½?br /> while (!(command = input.next()).equalsIgnoreCase("-quit"))
{
// 获å–帮助
if (command.equalsIgnoreCase("-help"))
{
ser.helpList();
}
// åˆå§‹åŒ–æœåС噍
if (command.equalsIgnoreCase("-run"))
{
boolean goon = true;
while (goon)
{
System.out.println("1.输入æœåŠ¡å™¨çš„IP地å€åQŒé»˜è®¤è¾“入数å?åQ?);
getIp = input.next();
System.out.println("2.输入æœåŠ¡å™¨çš„ç«¯å£åøP¼Œé»˜è®¤è¾“入数å—0åQ?);
try
{
getPort = input.nextInt();
}
catch (Exception e)
{
System.out.println("!-The port style is not currect!");
}
// ‹¹‹è¯•æœåŠ¡å™¨åˆ›å»ºï¼Œå¦‚æžœæˆåŠŸåˆ™åŒæ—¶äØ“(f¨´)ä¿¡æ¯ç›‘å¬å™¨å¾ç«‹çº¿½E?br /> System.out.println("!-åˆ›å¾æœåŠ¡å™¨åÆˆ˜q行...");
if (ser.testServer(getIp, getPort))
{
new Thread(ser).start();
goon = false;
}
else
System.out.println("!-æœåŠ¡å™¨åˆ›å»ºå¤±è´¥ï¼Œè¯äh£€æŸ¥ï¼");
}
}
// 关闿œåŠ¡å™?br /> if (command.equalsIgnoreCase("-stop"))
{
ser.cutServer();
}
}
input.close();
ser.cutServer();
}
/**
* 错误æç¤º
*
* @param str
*/
public static void errorTip(String str)
{
System.out.println("-----------------\n" + str + "\n-----------------");
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;
/**
*
*<br>
* 客户端的实现效果 <br>
*<br>
* 1.ç™Õd½•æœåŠ¡å™¨ï¼Œå¦‚æžœæœåŠ¡å™¨ç«¯å£å·å’ŒIP寂¾“入的å—符都是"0"则,客户端连接到默认的æœåС噍 <br>
*<br>
* 2.输入èŠå¤©æ˜ëЧ° <br>
*<br>
* 3.输入"-quit"ä¼?x¨¬)自动退å‡?gu¨®)™Šå?<br>
*<br>
* 4.输入"-getList"ä¼?x¨¬)得到在¾U¿ç”¨æˆïL(f¨¥ng)š„åç§° <br>
*<br>
* 5.输入"-to <用户åç§°> <èŠå¤©ä¿¡æ¯>"ä¼?x¨¬)把信æ¯å‘é€åˆ°æŒ‡å®šçš„用户处åQŒä»–人看ä¸åˆ° <br>
*<br>
* 6.输入"-help"ä¼?x¨¬)得到客æˆïL(f¨¥ng)«¯ç›¸åº”æ“作帮助 <br>
*<br>
* 6.直接输入内容则会(x¨¬)ž®†å†…容å‘é€åˆ°æ‰€æœ‰åœ¨¾U¿çš„用户å¤?<br>
*<br>
*<br>
*<br>
*<br>
* 客户端的¾cÖM¸Žæ–ÒŽ(gu¨©)³• <br>
*<br>
* 1.建立˜qžæŽ¥æ–ÒŽ(gu¨©)³•åQšconnectServer(String ip,int port) <br>
*<br>
* 2.æ–å¼€˜qžæŽ¥æ–ÒŽ(gu¨©)³•åQšdisconnectServer() <br>
*<br>
* 2.å‘逿¶ˆæ¯æ–¹æ³•:(x¨¬)sendMes(String mes) <br>
*<br>
* 3.æŽ¥å—æ¶ˆæ¯æ–ÒŽ(gu¨©)³•åQšgetMes() <br>
*<br>
* 4.接å—一‹Æ¡æ¶ˆæ¯ï¼š(x¨¬)getMesOnce() <br>
*<br>
* 5.获得用户列表åQšgetList(String mes) <br>
*<br>
* 6.‹¹‹è¯•˜qžæŽ¥æ–ÒŽ(gu¨©)³•åQštestConnect(String ip,int port) <br>
*<br>
* 7.‹‚€(g¨¨)查用户å åQšcheckNickName(String nickName) <br>
*<br>
* 8.获得帮助列表åQšhelpList()åQ?<br>
*<br>
* 9.å„项内容的输入在mainæ–ÒŽ(gu¨©)³•ä¸è¿›è¡?<br>
*<br>
*<br>
*<br>
*<br>
* é‡ç‚¹æ³¨æ„的地æ–?<br>
*<br>
* ç”׃ºŽå®¢æˆ·ç«¯æ— æ³•çŸ¥é“æœåŠ¡å™¨ä½•æ—¶è½¬å‘æ•°æ®åQŒæ‰€ä»¥å®¢æˆïL(f¨¥ng)«¯éœ€è¦ä¸€ç›´ä¸åœåœ°ç›‘嬿¶ˆæ¯åQŒäØ“(f¨´)äº?ji¨£n)ä¸å½±å“其他的方法,如å‘逿•°æ®ï¼Œ˜q™é‡Œç”¨åˆ°å¤šçº¿½E‹ï¼Œå³äØ“(f¨´)æŽ¥å—æ•°æ®å•独建立一个线½E‹ï¼Œä»¥é˜²æ¢åª„(ji¨£ng)å“其他方法的æ£å¸¸å·¥ä½œã€?br /> *
*/
public class ChatClient implements Runnable
{
// å‘逿•°æ®çš„æœåŠ¡å™¨Net地å€åQŒåœ¨fixServerLink
// å’ŒsendMesæ–ÒŽ(gu¨©)³•ä¸ä¼š(x¨¬)用到
private InetAddress sendAddress = null;
private int port = 0;
// 客户�br /> private DatagramSocket client = null;
// å‘é€çš„æ•°æ®æŠ?br /> private DatagramPacket sendDatas = null;
// 用楋¹‹è¯•是å¦èƒ½å¤Ÿ˜qžæŽ¥æˆåŠŸæˆ–è€…ç”¨æˆ·åæ˜¯å¦æ£ç¡®
// 在testConnectå’ŒcheckNickNameä¸ä¼š(x¨¬)用到.
// òq¶ç©¿æ’在sendMesæ–ÒŽ(gu¨©)³•ä¸?br /> private boolean test = true;
/**
* 建立˜qžæŽ¥
*
* @param ip æœåС噍IPå?br /> * @param port æœåС噍Port
*/
public void connectServer(String ip, int port)
{
// 先确定输入的IP与端å£å·æ˜¯å¦½W¦åˆè§„则
this.fixServerLink(ip, port);
try
{
client = new DatagramSocket();
}
catch (SocketException s)
{
System.out.println("The Connection of server is error.");
}
}
/**
* ¼‹®å®šIP与Portè¾“å…¥æ˜¯å¦æ£ç¡®
*
* @param ip
* @param port
*/
private void fixServerLink(String ip, int port)
{
// 判斘qžæŽ¥æœåŠ¡å™¨çš„ç«¯å£å?br /> // 如果输入命ä×o(h¨´)ä¸?åQŒåˆ™ä¸ºé»˜è®¤ç«¯å£å·9999
// å¦åˆ™ç«¯å£å·äØ“(f¨´)新端å£å·
if (port == 0)
this.port = 9999;
else
this.port = port;
// 判斘qžæŽ¥æœåŠ¡å™¨çš„IP地å€
// 如果输入命ä×o(h¨´)ä¸?åQŒåˆ™ä¸ºé»˜è®¤çš„æœ¬åœ°IP地å€
// å¦åˆ™ä¸ø™¾“入的IP地å€
try
{
if (ip.equalsIgnoreCase("0"))
this.sendAddress = InetAddress.getLocalHost();
else
this.sendAddress = InetAddress.getByName(ip);
}
catch (UnknownHostException u)
{
System.out.println("Sorry, IP address you put is not currect!");
}
}
/**
* æ–å¼€˜qžæŽ¥
*/
public void disconnectServer()
{
// 当客æˆïL(f¨¥ng)«¯æ–å¼€˜qžæŽ¥ä¹‹å‰åQŒå®¢æˆïL(f¨¥ng)«¯ä¼?x¨¬)呿œåŠ¡å™¨ç«¯å‘é€ä¸€ä¸ªä¿¡æ¯ï¼Œ
// 以便告诉æœåŠ¡å™¨è¯¥å®¢æˆ·ä¸‹çº¿
this.sendMes("-quit");
if (client != null)
client.close();
}
/**
* å‘逿¶ˆæ?br /> *
* @param mes
*/
public void sendMes(String mes)
{
byte[] buf = mes.getBytes();
sendDatas = new DatagramPacket(buf, buf.length, sendAddress, port);
// 当å¾ç«‹å‘逿—¶åQŒæµ‹è¯•æ£å¸?br /> test = true;
try
{
client.send(sendDatas);
}
catch (NullPointerException n)
{
// å¦‚æžœæ— æ³•å¾—åˆ°è¦å‘é€çš„æ¶ˆæ¯åQŒæµ‹è¯•终æ?br /> test = false;
System.out.println("The nullity of the address of connection");
}
catch (IOException s)
{
// å¦‚æžœæ— æ³•å‘逿¶ˆæ¯è‡³æœåŠ¡å™¨ï¼Œ‹¹‹è¯•¾lˆæ¢
test = false;
System.out.println("There is a problem to send message.");
}
finally
{
}
}
/**
* 得到数æ®
*/
public void getMes()
{
byte[] buf = new byte[1024];
DatagramPacket getDatas = new DatagramPacket(buf, buf.length);
String mes = null;
try
{
while (true)
{
client.receive(getDatas);
mes = new String(buf, 0, getDatas.getLength());
// 如果æœåС噍å‘é€çš„æ¶ˆæ¯ä¸çš„头片ŒD‰|œ‰-getList
// 表明客户端获得在¾U¿ç”¨æˆ·åˆ—表,调用getListæ–ÒŽ(gu¨©)³•è§£æž
if (mes.indexOf("-getList") == 0)
this.getList(mes);
else
System.out.println(mes);
}
}
catch (IOException i)
{
System.out.println("Fail in receving message");
}
}
/**
* 得到一‹Æ¡æ•°æ?br /> *
*/
public String getMesOnce()
{
byte[] buf = new byte[1024];
DatagramPacket getDatas = new DatagramPacket(buf, buf.length);
String mes = null;
try
{
client.receive(getDatas);
mes = new String(buf, 0, getDatas.getLength());
}
catch (Exception e)
{
System.out.println("!-Can not receive the message!");
}
finally
{
}
return mes;
}
/**
* 昄¡¤ºåœ¨çº¿ç”¨æˆ·åˆ—表
*
* @param mes
*/
private void getList(String mes)
{
String[] list = mes.split(",");
System.out.println("在线用户åQš\n-------------");
for (int i = 1; i < list.length; i++)
{
System.out.println(" * " + list[i]);
}
System.out.println("-------------");
}
/**
* ‹¹‹è¯•˜qžæŽ¥
*
* @param ip
* @param port
* @return
*/
public boolean testConnect(String ip, int port)
{
// 创徘qžæŽ¥åQŒæµ‹è¯•è¿žæŽ¥æ˜¯å¦æ£¼‹?br /> this.connectServer(ip, port);
// 如果˜qžæŽ¥æ£ç¡®åQŒè¯•囑֑逿µ‹è¯•æ ‡è¯?-test"
// 在å‘逿•°æ®è¿‡½E‹ä¸‹¹‹è¯•˜qžæŽ¥æ˜¯å¦æ£ç¡®
this.sendMes("-test");
// 如果˜qžæŽ¥å‘逿µ‹è¯•通过
// 则开始测试是å¦èƒ½å¤Ÿæ£¼‹?br /> if (test)
{
String mes = this.getMesOnce();
// 如果æœåŠ¡å™¨è¿”å›žç›¸åº”çš„æ ‡è¯†åQŒæµ‹è¯•通过
if (mes.startsWith("-test"))
{
test = true;
}
}
if (client != null)
{
client.close();
}
return test;
}
/**
* 判æ–用户åè¾“å…¥æ˜¯å¦æ£¼‹?br /> */
private boolean checkNickName(String nickName)
{
test = true;
String mes = null;
// åˆ¤æ–æ˜ëЧ°æ˜¯å¦½W¦åˆ¾U¦å®š
for (int i = 0; i < nickName.length(); i++)
{
char temp = nickName.charAt(i);
// 如果ä¸ç¬¦åˆï¼Œåˆ™ç»ˆæ¢æµ‹è¯?br /> if (!Character.isLetterOrDigit(temp))
{
test = false;
break;
}
}
// 如果通过¾U¦å®šåQŒåˆ™è¯•图呿œåС噍å‘逿˜µ¿UŽÍ¼Œ˜q›è¡Œåˆ¤æ–
if (test)
{
this.sendMes("-nick " + nickName);
mes = this.getMesOnce();
// 如果æœåŠ¡å™¨è¿”å›?-nick"æ ‡è¯†
// 说明‹¹‹è¯•æ˜ëЧ°å¤ÞpÓ|åQŒç»ˆæ¢æµ‹è¯?br /> if (mes.startsWith("-nick"))
{
test = false;
}
}
System.out.println(mes);
return test;
}
/**
* 得到帮助列表
*
*/
public void helpList()
{
System.out.println("é‡è¦è¯´æ˜ŽåQšå¦‚果已¾læˆåŠŸè¿žæŽ¥ï¼Œåªè¦è¾“入内容åQŒæ‰€æœ‰åœ¨¾U¿ç”¨æˆ·éƒ½èƒ½çœ‹åˆ°æ?zh¨¨n)¨çš„å‘a€ã€? + "\n" + "-help" + " 获å–客户端相应æ“作的帮助" + "\n"
+ "-test" + " ‹¹‹è¯•与æœåŠ¡å™¨çš„è¿žæŽ¥ï¼Œå¦‚æžœå·²ç»æœåŠ¡å™¨è¿žæŽ¥ï¼Œè¯·ä¸è¦é€‰ç”¨æ¤é¡¹" + "\n" + "-getList" + " 得到在线用户的列è¡? + "\n"
+ "-to <name> <message>" + "\n" + " ž®†æ¶ˆæ¯å‘é€åˆ°ç‰¹å®šçš„在¾U¿ç”¨æˆ·å¤„" + "\n" + "-quit"
+ " æ–å¼€˜qžæŽ¥åQŒé€€å‡?gu¨®)™Šå¤©å®? + "\n");
}
/**
* ¾U¿ç¨‹éƒ¨åˆ†
*/
public void run()
{
getMes();
}
/**
* å„项内容的æ“作器
*/
public static void main(String[] args)
{
ChatClient consumer = new ChatClient();
String getIp = null;
int getPort = 0;
System.out.println("‹Æ¢è¿Žç™Õd½•SunspotèŠå¤©å®¤ï¼");
Scanner input = new Scanner(System.in);
// 输入IP与Port
boolean goahead = true;
while (goahead)
{
System.out.println("1.误‚¾“å…¥æœåС噍IP地å€åQŒé»˜è®¤è¯·è¾“入数å—0 åQ?);
// ½W¬ä¸€æ¥ï¼š(x¨¬)输入æœåŠ¡å™¨çš„IP地å€
getIp = input.next();
// ½W¬äºŒæ¥ï¼š(x¨¬)输入æœåŠ¡å™¨çš„ç«¯å£å?br /> System.out.println("2.误‚¾“å…¥æœåŠ¡å™¨ç«¯å£åøP¼Œé»˜è®¤è¯¯‚¾“入数å? åQ?);
try
{
getPort = input.nextInt();
}
catch (InputMismatchException i)
{
errorTip("!-The port style is not currect!");
}
catch (NoSuchElementException n)
{
errorTip("!-The port style is not currect!");
}
// ‹¹‹è¯•æœåŠ¡å™?br /> System.out.println("!-æ£åœ¨‹¹‹è¯•˜qžæŽ¥æœåŠ¡å™¨ï¼Œè¯ïL(f¨¥ng)¨å€?..");
if (consumer.testConnect(getIp, getPort))
{
System.out.println("!-˜qžæŽ¥æˆåŠŸåQ?);
goahead = false;
}
else
System.out.println("!-˜qžæŽ¥å¤ÞpÓ|åQŒæ?zh¨¨n)¨è¾“入的IPå?qi¨¢ng)端å£å·é”™è¯¯ã€?);
}
// ˜qžæŽ¥æœåŠ¡å™?br /> consumer.connectServer(getIp, getPort);
// 输入æ˜ëЧ°
boolean goon = true;
while (goon)
{
// ½W¬ä¸‰æ¥ï¼š(x¨¬)输入æ˜ëЧ°
System.out.println("3.误‚¾“å…¥æ?zh¨¨n)¨ç™Õd½•åŽæ˜¾½Cºçš„æ˜ëŠ§°(åªèƒ½è¾“入䏿–‡ã€è‹±æ–‡å—æ¯åŠ(qi¨¢ng)æ•°å—)åQ?);
String nick = input.next();
boolean judge = consumer.checkNickName(nick);
// åˆ¤æ–æ˜ëЧ°æ˜¯å¦è¾“å…¥æ£ç¡®
if (judge)
goon = false;
else
System.out.println("!-æ‚(zh¨¨n)¨è¾“入的用户å丽W¦åˆæ¡äšgåQŒè¯·é‡æ–°è¾“å…¥åQ?);
}
// 开始è¿è¡ŒæŽ¥æ”¶æ•°æ?br /> new Thread(consumer).start();
// èŠå¤©
String mes = null;
System.out.println("!-æ‚(zh¨¨n)¨æˆåŠŸè¿›å…¥èŠå¤©å®¤åQ?);
while (!(mes = input.nextLine()).equalsIgnoreCase("-quit"))
{
// 如果输入"-test"命ä×o(h¨´)åQŒå¼€å§‹æµ‹è¯?br /> if (mes.trim().equalsIgnoreCase("-test"))
{
consumer.testConnect(getIp, getPort);
// -getListåQšèŽ·å¾—åœ¨¾U¿ç”¨æˆ·åˆ—è¡?br /> }
else if (mes.trim().equalsIgnoreCase("-getList"))
{
consumer.sendMes(mes);
// -nick 讄¡½®æ˜ëЧ°
}
else if (mes.startsWith("-nick "))
{
System.out.println("!-You have named, Can not allowed to rename!");
// -help 获得帮助列表
}
else if (mes.equalsIgnoreCase("-help"))
{
consumer.helpList();
// 如果输入的是½Iºå—½W¦ï¼Œåˆ™ä¸å‘é€?br /> }
else if (mes.equals(""))
{
}
else
{
consumer.sendMes(mes);
}
}
// 退�br /> input.close();
consumer.disconnectServer();
}
/**
* 错误æç¤ºæ ‡è®°
*
* @param str
*/
public static void errorTip(String str)
{
System.out.println("-----------------\n" + str + "\n-----------------");
}
}
set APP_DIR=D:\tools\tomcat6.0\wtpwebapps\com.tianhe.jxc
set APP_LIB_PATH=%APP_DIR%\WEB-INF\lib
set APP_CLASS_PATH=%APP_DIR%\WEB-INF\classes
java -Djava.ext.dirs=%APP_LIB_PATH% -cp %APP_CLASS_PATH%;. com.tianhe.frm.http.server.SimpleHttpServer -port 8080 -charset gbk
rem sc.bat
set APP_DIR=D:\tools\tomcat6.0\wtpwebapps\com.tianhe.jxc
set APP_LIB_PATH=%APP_DIR%\WEB-INF\lib
set APP_CLASS_PATH=%APP_DIR%\WEB-INF\classes
java -Djava.ext.dirs=%APP_LIB_PATH% -classpath -cp %APP_CLASS_PATH%;. com.tianhe.frm.http.client.SimpleHttpClient -url http://www.aygfsteel.com/Images/adminlogo.gif -dir d:/wallpaper