?? chatserver.java
字號:
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.TextArea;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
/*
*
*
*/
public class ChatServer extends Frame
{
final static int PORT = 1234; // Server Socket的監聽端口
// TODO
// static int userCount = 0;
private Panel panel = null;
private static Label label = null;
static TextArea msgArea = null;
/**
* This method initializes panel
*
* @return java.awt.Panel
*/
private Panel getPanel()
{
if (panel == null)
{
label = new Label();
label.setBounds(new Rectangle(100, 4, 250, 24));
label.setFont(new Font("Dialog", Font.PLAIN, 16));
label.setText("服務器監視器");
panel = new Panel();
panel.setLayout(null);
panel.setBounds(new Rectangle(4, 32, 408, 213));
panel.add(label, null);
panel.add(getTextArea(), null);
}
return panel;
}
/**
* This method initializes textArea
*
* @return java.awt.TextArea
*/
private TextArea getTextArea()
{
if (msgArea == null)
{
msgArea = new TextArea();
msgArea.setBounds(new Rectangle(8, 28, 391, 172));
msgArea.setEditable(false);
}
return msgArea;
}
public ChatServer()
{
super();
this.setLayout(null);
this.setSize(418, 251);
this.setTitle("聊天室服務器監視器");
this.setVisible(true);
this.add(getPanel(), null);
this.setResizable(false);
this.addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(java.awt.event.WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String args[])
{
ServerSocket server = null;
Socket user = null; // 對于一個用戶會啟動一個服務線程
Hashtable userList = new Hashtable(); // 保存用戶列表
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e)
{
e.printStackTrace();
}
ChatServer myserver = new ChatServer(); // 實例化一個chatServer類
msgArea.append("Server starting ...\n");
try
{
server = new ServerSocket(PORT);// 設置監聽端口
if (server != null)
{
msgArea
.append("The server is listening on port " + PORT
+ "\n");
}
} catch (IOException e)
{
// TODO 自動生成 catch 塊
// e.printStackTrace();
JOptionPane.showMessageDialog(null, "Socket連接失敗", "服務器運行錯誤",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
while (true)
{
try
{
user = server.accept();// 服務器接到一個用戶的socket請求
} catch (IOException e)
{
// TODO 自動生成 catch 塊
e.printStackTrace();
}
if (user != null)
{
InetAddress address = user.getInetAddress(); // 獲取用戶的IP地址
// 啟動一個服務線程為該用戶服務
ServerThreadForUser userThread = new ServerThreadForUser(user,
userList, address, msgArea);
userThread.start();
} else
// 異常情況
{
msgArea.append("Error in accept user!\n");
continue;
}
}
}
}
/*
* 該線程接收用戶端socket的信息并反饋
*
*/
class ServerThreadForUser extends Thread
{
String name = null, nickName = null;
Socket socket = null;
File file = null;
DataOutputStream out = null;
DataInputStream in = null;
Hashtable userList = null;
TextArea msgArea = null;
InetAddress address = null;
ServerThreadForUser(Socket userSocket, Hashtable list, InetAddress address,
TextArea msgArea)
{
userList = list;
socket = userSocket;
this.address = address;
this.msgArea = msgArea;
try
{
in = new DataInputStream(socket.getInputStream());// 用戶socket寫入
out = new DataOutputStream(socket.getOutputStream()); //
} catch (IOException e)
{
// TODO 自動生成 catch 塊
e.printStackTrace();
}
}
public void run()
{
while (true)
{
String info = null;
try
{
info = in.readUTF();
if (info.startsWith("姓名:"))
{
name = info.substring(info.indexOf(":") + 1, info
.indexOf("昵稱"));
nickName = info.substring(info.lastIndexOf(":") + 1);
if (userList.containsKey(name) == false) // 用戶名不可重名
{
msgArea.append("用戶:" + name + " 進入聊天室(IP:" + address
+ ")\n");
userList.put(name, this); // 可以聊天,加入user list
out.writeUTF("可以聊天:");
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
userThread.out.writeUTF("聊天者:" + name + "昵稱:"
+ nickName);
if (userThread != this) // 非本用戶
{
out.writeUTF("聊天者:" + userThread.name + "昵稱:"
+ userThread.nickName);
}
}
} else
// 已經有這個用戶?
{
out.writeUTF("不可以聊天:");
}
} else if (info.startsWith("公共聊天內容:"))
{
String pubMsg = info.substring(info.indexOf(":") + 1);
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
((ServerThreadForUser) userEnum.nextElement()).out
.writeUTF("聊天內容:" + pubMsg);
}
} else if (info.startsWith("用戶離開:"))
{
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
try
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
if (userThread != this && userThread.isAlive())
{
userThread.out.writeUTF("用戶離線:" + name);
}
} catch (IOException e)
{
}
}
userList.remove(name); // 清除該用戶在user list中的相應項
socket.close();
msgArea.append("用戶:" + name + " 離開了\n");
break;
}
} catch (IOException e)
{ // 對于異常的處理,用戶離線
Enumeration userEnum = userList.elements();
while (userEnum.hasMoreElements())
{
ServerThreadForUser userThread = (ServerThreadForUser) userEnum
.nextElement();
if (userThread != this && userThread.isAlive())
{
try
{
userThread.out.writeUTF("用戶離線:" + name);
} catch (IOException e1)
{
// TODO 自動生成 catch 塊
e1.printStackTrace();
}
}
}
if (name != null)
userList.remove(name);
try
{
socket.close();
in.close();
out.close();
} catch (IOException e1)
{
// TODO 自動生成 catch 塊
e1.printStackTrace();
}
msgArea.append("用戶:" + name + " 離開了\n");
break;
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -