?? clientthread.java
字號:
// 程序:處理客戶端聯(lián)機(jī)多線程
// 范例文件:ClientThread.java
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*; //為了建立Vector實體
import java.awt.event.*;
class ClientThread extends Thread //用來和客戶端溝通的線程
{
Socket cSocket; //和客戶端聯(lián)機(jī)的插座
PrintStream write; //輸出訊息
BufferedReader read; //輸入訊息
ServerThread sThread;
TextArea sStatus;
String m;
public static int ConnectNumber = 0; //計算聯(lián)機(jī)數(shù)
public ClientThread(Socket cSocket,ServerThread sThread)
{
this.cSocket = cSocket;
this.sThread = sThread;
sStatus = sThread.frame.ServerStatus;
ConnectNumber++; //建立新聯(lián)機(jī),聯(lián)機(jī)數(shù)加1
try
{
//建立I/O管道
write = new PrintStream(cSocket.getOutputStream());
read = new BufferedReader(
new InputStreamReader(cSocket.getInputStream()));
}
catch(IOException E) //發(fā)生異常的話
{
System.out.println("發(fā)生異常: " + E);
System.out.println("建立I/O管道失敗!");
System.exit(3); //離開程序
}
m = "新伙伴<" + getClientName() + ">加入啰!!! ";
m = m + "聊天室人數(shù): " + ConnectNumber + " \n\n";
sThread.messages.addElement(m);//廣播新成員加入訊息
}
public void run()
{
while(true)
{
try
{
String Message = read.readLine(); //讀取客戶端訊息
synchronized(sThread.messages) //同步處理
{
if(Message != null) //讀到資料
{
if(Message.equals("bye")) //如果是bye字符串則結(jié)束聯(lián)機(jī)
{
ConnectNumber--; //聯(lián)機(jī)數(shù)減1
//廣播成員離開訊息
Message = getClientName() + ":" + getClientAddress() +
"已離開 ";
sStatus.append(Message + " ");
sStatus.append("目前聯(lián)機(jī)數(shù): " + ConnectNumber + "\n");
sThread.messages.addElement(Message);
synchronized(sThread.Clients) //同步處理
{
sThread.Clients.removeElement(this); //移除聯(lián)機(jī)
}
break; //結(jié)束線程
}
else
{
//廣播客戶端訊息
Message = "來自" + getClientName() + ":" +
getClientAddress() + "\n=> " + Message + "\n";
sThread.messages.addElement(Message);
}
}
}
}
catch(IOException E) //當(dāng)有聯(lián)機(jī)中斷時
{
break; //結(jié)束線程
}
}
}
public String getClientName() //取得客戶端主機(jī)名稱
{
return cSocket.getInetAddress().getHostName();
}
public String getClientAddress() //取得客戶端主機(jī)位置
{
return cSocket.getInetAddress().getHostAddress();
}
public void finalize()
{
try
{
read.close();
write.close();
cSocket.close(); //關(guān)閉服務(wù)器程序聯(lián)機(jī)
}
catch(IOException E){}
cSocket = null; //釋放資源
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -