前面Server和Client只是進行了簡單的通信操作
當我們使用傳統BufferedReader的readLine()方法讀取數據時
客戶端讀取服務器數據的線程同樣會被阻塞
下面考慮實現一個命令行界面的C/S聊天室應用
下面是服務器端的實現代碼
程序清單
public class MyServer
{
//定義保存所有Socket的ArrayList
public static ArrayList<Socket> socketList = new ArrayList<Socket>()
public static void main(String[] args)
throws IOException
{
ServerSocket ss = new ServerSocket(
while(true)
{
//此行代碼會阻塞
Socket s = ss
socketList
//每當客戶端連接後啟動一條ServerThread線程為該客戶端服務
new Thread(new ServerThread(s))
}
}
}
上面程序是服務器端只負責接受客戶端Socket的連接請求
程序清單
//負責處理每個線程通信的線程類
public class ServerThread implements Runnable
{
//定義當前線程所處理的Socket
Socket s = null;
//該線程所處理的Socket所對應的輸入流
BufferedReader br = null;
public ServerThread(Socket s)
throws IOException
{
this
//初始化該Socket對應的輸入流
br = new BufferedReader(new InputStreamReader(s
}
public void run()
{
try
{
String content = null;
//采用循環不斷從Socket中讀取客戶端發送過來的數據
while ((content = readFromClient()) != null)
{
//遍歷socketList中的每個Socket
//將讀到的內容向每個Socket發送一次
for (Socket s : MyServer
{
PrintStream ps = new PrintStream(s
ps
}
}
}
catch (IOException e)
{
//e
}
}
//定義讀取客戶端數據的方法
private String readFromClient()
{
try
{
return br
}
//如果捕捉到異常
catch (IOException e)
{
//刪除該Socket
MyServer
}
return null;
}
}
上面服務器端線程類不斷讀取客戶端數據
[
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27783.html