?? multicliserver.java
字號:
import java.io.*;
import java.net.*;
/**類MultiCliServer是多客戶的服務器端程序,該程序通過線程實現多客戶通信機制*/
public class MultiCliServer{
/*整型變量clientnum表示客戶端的個數*/
static int clientnum = 0;
public static void main(String args[])throws IOException{
/*聲明一個ServerSocket對象,初始值為null*/
ServerSocket serverSocket = null;
/*聲明一個布爾變量existClient,用于表示端口處有無客戶端的訪問*/
boolean existClient = true;
/*由于ServerSocket的生成和關閉都有可能產生錯誤,因此需要進行例外處理*/
try{
try{
/*生成serverSocket對象,該對象負責監聽端口4700*/
serverSocket=new ServerSocket(4700);
}catch(IOException e) {
System.out.println("對不起,不能監聽端口:4700.");
System.exit(-1);
}
/*對機器的4700端口進行監聽,看是否有客戶端的socket連接*/
while(existClient)
{
/*如果有客戶端的socket連接,就生成ServerThread類的對象,也就是新生成一個線程對象,以進行輸入流、輸出流生成以及數據的讀取操作*/
ServerThread threadObj = new ServerThread(serverSocket.accept(),clientnum);
/*啟動threadObj線程對象,執行線程對象中的run()方法*/
threadObj.start();
/*將客戶端的數目加1*/
clientnum++;
}
/*將服務器的socket關閉*/
serverSocket.close();
}catch(IOException e){}
}
}
/**類ServerThread是Thread的子類,用于創建一個線程對象來實現一個客戶端和服務器端的通信*/
class ServerThread extends Thread{
/*生成一個Socket對象,初始值為null*/
Socket clientSocket = null;
/*聲明一個靜態整型變量clientnum*/
int clientnum;
/*構造方法對上面的對象和變量賦值*/
public ServerThread(Socket socket,int num) {
clientSocket=socket;
/*每生成一個線程,客戶端數目就加1*/
clientnum=num+1;
}
/*方法run()實現輸入流、輸出流的創建以及數據的讀取和輸出*/
public void run() {
/*由于socket的生成和關閉都有可能產生錯誤,因此需要進行例外處理*/
try{
/*聲明一個字符串變量,用于存放讀取的一行數據*/
String lineStr;
/*通過socket對象的getInputStream()方法獲得輸入流,將它賦給inObj對象*/
InputStream inObj = clientSocket.getInputStream();
/*根據上面的InputStream類對象inObj生成InputStreamReader類的對象streamObj1*/
InputStreamReader streamObj1 = new InputStreamReader(inObj);
/*根據streamObj1生成BufferedReader類的對象buffObj1,以提高數據讀取效率*/
BufferedReader buffObj1 = new BufferedReader(streamObj1);
/*獲得socket的輸出流,將它賦給OutputStream類的對象putObj*/
OutputStream putObj = clientSocket.getOutputStream();
/*根據獲得的輸出流創建PrintWriter類對象outObj,用于輸出信息*/
PrintWriter outObj = new PrintWriter(putObj);
/*生成一個InputStreamReader對象,對應鍵盤的輸入*/
InputStreamReader streamObj2 = new InputStreamReader(System.in);
/*根據上面的streamObj2輸入流創建BufferedReader類的對象,以提高數據讀取效率*/
BufferedReader buffObj2 = new BufferedReader(streamObj2);
/*輸出客戶端的輸入信息*/
System.out.println("Client "+clientnum+ ":" + buffObj1.readLine());
/*讀取服務器端鍵盤輸入的數據,放在字符串lineStr中*/
lineStr = buffObj2.readLine();
/*判斷服務器端輸入的字符串是不是“end”,如果不是就進行循環*/
while(!lineStr.equals("end"))
{
/*將服務器端輸入的字符串通過socket在客戶端輸出*/
outObj.println(lineStr);
/*在客戶端強制輸出服務器端輸入的字符串*/
outObj.flush();
/*在服務器端輸出自己這端鍵盤輸入的字符串*/
System.out.println("Server:"+lineStr);
/*在服務器端輸出客戶端輸入的信息*/
System.out.println("Client "+ clientnum + ":" +buffObj1.readLine());
/*將服務器端鍵盤輸入的信息放在字符串變量lineStr中*/
lineStr = buffObj2.readLine();
}
/*關閉輸出流*/
outObj.close();
/*關閉輸入流*/
buffObj1.close();
/*關閉socket*/
clientSocket.close();
}catch(Exception e) {
System.out.println("錯誤:"+e);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -