?? serverthread.java
字號:
import java.io.*;
import java.net.*;
import java.util.*;
/**
* @author yeeku.H.lee kongyeeku@163.com
* @version 1.0
* <br>Copyright (C), 2005-2008, yeeku.H.Lee
* <br>This program is protected by copyright laws.
* <br>Program Name:
* <br>Date:
*/
public class ServerThread extends Thread
{
private Socket socket;
BufferedReader br = null;
PrintStream ps = null;
//定義一個構造器,用于接收一個Socket來創建ServerThread線程
public ServerThread(Socket socket)
{
this.socket = socket;
}
public void run()
{
try
{
//獲取該Socket對應的輸入流
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//獲取該Socket對應的輸出流
ps = new PrintStream(socket.getOutputStream());
String line = null;
while((line = br.readLine())!= null)
{
//如果讀到的行以MyProtocol.USER_ROUND開始,并以其結束,
//可以確定讀到的是用戶登陸的用戶名
if (line.startsWith(YeekuProtocol.USER_ROUND)
&& line.endsWith(YeekuProtocol.USER_ROUND))
{
//得到真實消息
String userName = getRealMsg(line);
//如果用戶名重復
if (Server.clients.containsKey(userName))
{
System.out.println("重復");
ps.println(YeekuProtocol.NAME_REP);
}
else
{
System.out.println("成功");
ps.println(YeekuProtocol.LOGIN_SUCCESS);
Server.clients.put(userName , ps);
}
}
//如果讀到的行以YeekuProtocol.PRIVATE_ROUND開始,并以其結束,
//可以確定是私聊信息,私聊信息只向特定的輸出流發送
else if (line.startsWith(YeekuProtocol.PRIVATE_ROUND)
&& line.endsWith(YeekuProtocol.PRIVATE_ROUND))
{
//得到真實消息
String userAndMsg = getRealMsg(line);
//以SPLIT_SIGN來分割字符串,前面部分是私聊用戶,后面部分是聊天信息
String user = userAndMsg.split(YeekuProtocol.SPLIT_SIGN)[0];
String msg = userAndMsg.split(YeekuProtocol.SPLIT_SIGN)[1];
//獲取私聊用戶對應的輸出流,并發送私聊信息
Server.clients.get(user).println(
Server.clients.getKeyByValue(ps) + "悄悄地對你說:" + msg);
}
//公聊要向每個Socket發送
else
{
//得到真實消息
String msg = getRealMsg(line);
//遍歷clients中的每個輸出流
for (PrintStream clientPs : Server.clients.valueSet())
{
clientPs.println(Server.clients.getKeyByValue(ps)
+ "說:" + msg);
}
}
}
}
//捕捉到異常后,表明該Socket對應的客戶端已經出現了問題
//所以程序將其對應的輸出流從Map中刪除
catch (IOException e)
{
Server.clients.removeByValue(ps);
System.out.println(Server.clients.size());
//關閉網絡、IO資源
try
{
if (br != null)
{
br.close();
}
if (ps != null)
{
ps.close();
}
if (socket != null)
{
socket.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
//將讀到的內容去掉前后的協議字符,恢復成真實數據
public String getRealMsg(String line)
{
return line.substring(YeekuProtocol.PROTOCOL_LEN
, line.length() - YeekuProtocol.PROTOCOL_LEN);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -