?? chatserver.java
字號:
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer {
static int port=5656; //端口號
static Vector clients=new Vector(10); //存儲連接客戶信息
static ServerSocket server=null; //建立服務(wù)器socket
static Socket socket=null; //套接字連接
public ChatServer() {
try {
System.err.println("Server start...");
server=new ServerSocket(port); //初始化服務(wù)器套接字
while(true){
socket=server.accept(); //等待連接
System.err.println(socket.getInetAddress()+"連接\n"); //得到客戶機(jī)地址
Client client=new Client(socket); //實(shí)例化一個(gè)客戶線程
clients.addElement(client); //增加客戶線程到向量中
client.start(); //啟動線程
notifyChatRoom(); //監(jiān)視聊天室連接變化
}
}
catch(Exception ex) {
ex.printStackTrace(); //輸出出錯(cuò)信息
}
}
public static void notifyChatRoom() {
StringBuffer newUser=new StringBuffer("newUser");
for(int i=0;i<clients.size();i++){
Client c=(Client)clients.elementAt(i);
newUser.append(":"+c.name); //客戶端姓名字符串
}
sendClients(newUser); //發(fā)送信息到客戶端
}
public static void sendClients(StringBuffer message){
for(int i=0;i<clients.size();i++){
Client client=(Client)clients.elementAt(i); //分別得到每個(gè)客戶端的連接
client.send(message); //發(fā)送信息
}
}
public void closeAll() { //關(guān)閉所有連接
while(clients.size()>0) { //遍歷整個(gè)Vector
Client client=(Client)clients.firstElement(); //得到一個(gè)客戶端
try{
client.socket.close(); //關(guān)閉端口
}
catch(IOException ex){
ex.printStackTrace(); //輸出錯(cuò)誤信息
}
clients.removeElement(client); //移出客戶端信息
}
}
public static void disconnect(Client c){ //斷開客戶端
try{
System.err.println(c.ip+"斷開連接\n");
c.send(new StringBuffer("QUIT")); //向客戶發(fā)送斷開連接信息
c.socket=null; //關(guān)閉端口
}
catch(Exception ex){
ex.printStackTrace();
}
clients.removeElement(c); //移出客戶端信息
}
public static void main(String[] args) {
new ChatServer(); //實(shí)例化一個(gè)ChatServer類
}
class Client extends Thread {
Socket socket; //連接端口
String name; //用戶姓名
String ip; //客戶端IP地址
BufferedReader reader ; //輸入流
PrintStream ps; //輸出流
public Client(Socket s){
socket=s;
try{
reader = new BufferedReader(new InputStreamReader(s.getInputStream())); //得到輸入流
ps=new PrintStream(s.getOutputStream()); //得到輸出流
String info=reader.readLine(); //讀取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":"); //分解字符串
String head=stinfo.nextToken(); //獲取關(guān)鍵字
if(stinfo.hasMoreTokens())
name=stinfo.nextToken(); //獲取用戶名
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken(); //獲取IP地址
}
catch(IOException ex){
ex.printStackTrace();
}
}
public void send(StringBuffer msg) {
ps.println(msg); //輸出信息
ps.flush();
}
public void run(){
while(true){
String line=null;
try{
line=reader.readLine(); //讀取數(shù)據(jù)流
}
catch(IOException ex){
ex.printStackTrace(); //輸出錯(cuò)誤信息
ChatServer.disconnect(this); //斷開連接
ChatServer.notifyChatRoom(); //更新信息
return;
}
if(line==null){ //客戶離開
ChatServer.disconnect(this);
ChatServer.notifyChatRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":"); //分解字符串
String keyword=st.nextToken();
if(keyword.equals("MSG")){ //發(fā)送來的是聊天信息
StringBuffer msg=new StringBuffer("MSG:");
msg.append(name); //在信息上增加用戶名
msg.append(st.nextToken("\0"));
ChatServer.sendClients(msg); //發(fā)送聊天語句到各個(gè)客戶端
}
else if(keyword.equals("QUIT")){ //退出命令
ChatServer.disconnect(this); //斷開連接
ChatServer.notifyChatRoom(); //刷新信息
}
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -