?? frame1.java~183~
字號:
public Client(Socket s) //Client 線程的構(gòu)造器
{
socket=s;
try{
dis=new DataInputStream(s.getInputStream());
//存儲特定客戶socket的輸入流,
//接受s客戶發(fā)送到服務(wù)器端的信息
ps=new PrintStream(s.getOutputStream());
//存儲特定客戶socket的輸出流,
//發(fā)送服務(wù)器給s客戶的信息
String info=dis.readLine();
//讀取接受到的信息
StringTokenizer stinfo=new StringTokenizer(info,":");
//讀取用":"分開的分段字符
String head=stinfo.nextToken();
//用head存儲關(guān)鍵字的頭信息
if(stinfo.hasMoreTokens())
name=stinfo.nextToken();
//關(guān)鍵字的第二個數(shù)據(jù)段是客戶的名稱
if(stinfo.hasMoreTokens())
ip=stinfo.nextToken();
//關(guān)鍵字的第三個數(shù)據(jù)段是客戶的IP地址
jTextArea2.append("系統(tǒng)消息: "+name+"/"+ip+" 已經(jīng)連接\n");
}
catch(IOException e){
jTextArea2.append("系統(tǒng)消息: 聊天服務(wù)器"+"Error "+e);
}
}
public void send(StringBuffer msg)
//實現(xiàn)向客戶端發(fā)送信息的方法
{
ps.println(msg);
//用打印流發(fā)送信息
ps.flush();
}
public void run(){ //線程的運行方法
while(true){
String line=null;
try{
line=dis.readLine(); //讀取客戶端發(fā)送的數(shù)據(jù)流
}
catch(IOException e)
{
jTextArea2.append("系統(tǒng)消息:"+" 聊天服務(wù)器"+" Error: "+e);
disconnect(this);
notifyRoom();
return ;
}
if(line==null) //客戶已經(jīng)離開
{
disconnect(this);
notifyRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":");
String keyword=st.nextToken();//存儲關(guān)鍵字,判斷消息類型
String broadcast=st.nextToken();//存儲消息是屬于廣播,還是屬于單播
//如果單播,則記錄的是目標(biāo)用戶名
if(keyword.equalsIgnoreCase("MSG")) //如果關(guān)鍵字是MSG,則是客戶端發(fā)送的聊天信息
{
StringBuffer message=new StringBuffer("MSG:");//在服務(wù)器端建立一個緩沖區(qū),用于信息的發(fā)送
message.append(broadcast+":");
message.append(st.nextToken("\0"));
if(broadcast.equalsIgnoreCase("BROAD"))
{
sendClients(message);
}
else
{
sendtoClient(message,broadcast);
}
}
else if(keyword.equalsIgnoreCase("QUIT")) //如果關(guān)鍵字是QUIT,則是客戶端發(fā)送的退出信息
{
list1.clear();
disconnect(this);
for(int i=0;i<clients.size();i++)
{
Client listdata1=(Client)clients.elementAt(i);
list1.add(listdata1.name+" "+listdata1.ip+" 已經(jīng)連接",i);
}
notifyRoom();
this.stop();
}
}
}
}
void send_actionPerformed(ActionEvent e) {
StringBuffer info=new StringBuffer("MSG");
info.append(":"+"BROAD"+"SERVER"+":");
info.append(jTextField2.getText());
sendClients(info);
jTextField2.setText("");
}
void sysexit_actionPerformed(ActionEvent e) {
sendClients(new StringBuffer("QUIT:"+"SERVER"));
closeAll();
System.exit(0);
}
void link_actionPerformed(ActionEvent e) {
//進行服務(wù)器的初始化建立
if (serverSocket == null) {
try {
serverSocket = new ServerSocket(4000);
//建立一個服務(wù)器,端口為4000
jTextArea2.append("系統(tǒng)提示: 聊天服務(wù)器"+
" 系統(tǒng)開始啟動......\n");
}
catch (IOException ee) {
jTextArea2.append("系統(tǒng)消息: 聊天服務(wù)器 "
+ e.toString() + "\n");
}
}
if(serverSocket!=null){
jTextArea2.append("系統(tǒng)消息: 聊天服務(wù)器"+
" 已經(jīng)啟動\n");
Thread a=new watch();
//啟動監(jiān)視線程
a.start();
}
}
class watch extends Thread{
int i=0;
public void run(){
while(true){
if(clients.size()<20)
//當(dāng)客戶數(shù)目小于20的時候開始連接
{
try{
socket=serverSocket.accept();
}
catch(IOException ee){
jTextArea2.append("系統(tǒng)消息: 聊天服務(wù)器 "+
ee.toString()+" 用戶連接失敗\n");
}
do{
Client c=new Client(socket);
//定義并實例化一個Client線程,每一個線程對應(yīng)一個客戶連接
clients.addElement(c);
//加入到clients數(shù)組中
if(checkName(c))
{
int num=active_connects+1;
active_connects++;//連接數(shù)目加1
jTextField1.setText("目前已經(jīng)有"+num+"用戶連接");
//在狀態(tài)欄中顯示目前的活動數(shù)目
Client listdata=(Client)clients.elementAt(i);
list1.add(listdata.name+" "+listdata.ip+" 已經(jīng)連接",i);
c.start();
//啟動線程
notifyRoom();
//監(jiān)視聊天窗口的連接變化
}
else{
c.ps.println("FaultName");
//檢查名字不合法,則在發(fā)送流中發(fā)送FaultName
disconnect(c);
//斷開連接
}
i++;
break;
}
while(i<clients.size());
}
else{ //如果超過連接數(shù)目
try{
Thread.sleep(400); //睡眠一段時間然后重新連接
}
catch(InterruptedException ee)
{
}
}
} //end of while*/
}//end of run
}////end of watch class
}
class Frame1_send_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_send_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.send_actionPerformed(e);
}
}
class Frame1_sysexit_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_sysexit_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.sysexit_actionPerformed(e);
}
}
class Frame1_link_actionAdapter implements java.awt.event.ActionListener {
Frame1 adaptee;
Frame1_link_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.link_actionPerformed(e);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -