?? bmanager.java
字號:
//聊天工具 - 服務器代碼
import java.net.*;
import java.io.*;
import java.util.*;
public class Server5 {
private ServerSocket server;
String test = "測試數(shù)據(jù)";
private BManager bMan = new BManager();
private AManager aMan = new AManager();
private Hashtable map = new Hashtable();
public Server5() {
startServer();
}
void startServer() {
try {
server = new ServerSocket(7778);
System.out.println("服務器創(chuàng)建完畢");
} catch (Exception e) {
// TODO: handle exception
}
while (true) {
Socket socket = null;
try {
socket = server.accept();
} catch (Exception e) {
// TODO: handle exception
}
new Chat_Thread(socket).start();
// 當有用戶連接時 把其放進map里面 并且用 ip 和 端口號 唯一標識
String flag = "";
try {
flag = socket.getRemoteSocketAddress().toString();
} catch (Exception e) {
System.err.println("數(shù)據(jù)轉換 " + e);
}
bMan.sendToUser("<thisname>"+flag, socket);
map.put(flag, socket);
bMan.add(socket);
aMan.add(flag);
// 用戶上線 先把當前所有在線用戶信息 以字符串的形式 傳遞給該用戶
bMan.sendToAll(aMan.getFlags());
// 同時 把這個人上線的消息發(fā)送給所有人
// 客戶端收到這條信息后 更新自己的在線人員列表
// bMan.sendClientInfo();
}
}
class Chat_Thread extends Thread {
Socket socket;
private BufferedReader reader;
private PrintWriter writer;
Chat_Thread(Socket socket) {
this.socket = socket;
}
//服務器 以讀取消息為主 根據(jù)收到的消息 來判斷如何發(fā)送消息
public void run() {
try {
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
} catch (Exception e) {
System.err.println("消息讀取錯誤 = " + e);
}
String msg = "";
try {
while ((msg = reader.readLine()) != null) {
System.out.println(msg);
if (msg == null || msg.trim().length() == 0)
continue;
System.out.println(msg);
/**
* 拆開字符串 從中得到 信息傳送方向 把信息傳遞到指定的socket
*
* 如果是以<ALL>開頭 就把消息發(fā)給全體 如果是以<sendto>開頭 ,則取到</sendto>
*/
String sendTo = "";
String sendTo2 = "";
if(msg.startsWith("<sendTo>")){
sendTo = msg.substring(msg.indexOf("#")+1 , msg.indexOf("</sendTo>"));
sendTo2 = msg.substring( msg.indexOf("<sendTo>")+8,msg.indexOf("#") );
}else{
System.out.println("here");
}
bMan.sendToAll(msg);
}
} catch (Exception e) {
System.err.println("############################" + e);
} finally {
try {
aMan.remove(socket.getRemoteSocketAddress().toString());
bMan.remove(socket);
bMan.sendToAll(aMan.getFlags());
if (reader != null)
reader.close();
if (writer != null)
writer.close();
if (socket != null)
socket.close();
reader = null;
writer = null;
socket = null;
System.out.println("客戶機離開.");
bMan.sendClientInfo();
} catch (Exception e) {
}
}
}
}
class AManager extends Vector {
/** 通過一個方法 把Vector里面的所有數(shù)據(jù) 全部以固定格式 放到一個String里面 */
String getFlags() {
String flags = "<userList>";
String flag = "";
for (int i = 0; i < size(); i++) {
flag = (String) elementAt(i);
flags += flag;
if(!( elementAt(i).toString() .equals( (String)this.lastElement()))){
flags+="#";
}
}
return flags;
}
/** 存放在線列表 */
AManager() {
}
void add(String flag) {
super.add(flag);
}
void remove(String flag) {
super.remove(flag);
}
}
class BManager extends Vector {
BManager() {
}
/** 添加刪除一個Socket */
void add(Socket sock) {
super.add(sock);
}
void remove(Socket sock) {
super.remove(sock);
}
synchronized void sendToAll(String msg) {
System.out.println("當前用戶列表" + msg);
PrintWriter writer = null;
Socket sock;
for (int i = 0; i < size(); i++) {
sock = (Socket) elementAt(i);
try {
writer = new PrintWriter(sock.getOutputStream(), true);
} catch (IOException ie) {
}
if (writer != null)
writer.println(msg);
}
}
synchronized void sendToUser(String msg ,Socket socket) {
PrintWriter writer = null;
try {
writer = new PrintWriter(socket.getOutputStream(), true);
} catch (IOException ie) {
}
if (writer != null)
writer.println(msg);
}
/** 向所有人發(fā)送當前用戶列表 */
synchronized void sendClientInfo() {
String info = "當前聊天人數(shù): " + size();
System.out.println(info);
sendToAll(info);
}
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public static void main(String[] args) {
Server5 server = new Server5();
System.out.println(server.getTest());
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -