1. 程式人生 > 實用技巧 >學習問題記錄(7)--網路程式設計

學習問題記錄(7)--網路程式設計

基於Socket實現多客戶/伺服器通訊程式

客戶端:

 1 package test;
 2 
 3 import java.io.IOException;
 4 import java.net.ServerSocket;
 5 public class MultiTalkServer{
 6     static int clientnum=0; //靜態成員變數,記錄當前客戶的個數
 7     public static void main(String args[]) throws IOException {
 8         ServerSocket serverSocket=null
; 9 boolean listening=true; 10 try{ 11 //建立一個ServerSocket在埠4700監聽客戶請求 12 serverSocket=new ServerSocket(4700); 13 }catch(IOException e) { 14 System.out.println("Could not listen on port:4700."); 15 //出錯,打印出錯資訊 16 System.exit(-1); //
退出 17 } 18 while(listening){ //迴圈監聽 19 //監聽到客戶請求,根據得到的Socket物件和客戶計數建立服務執行緒,並啟動之 20 new ServerThread(serverSocket.accept(),clientnum).start(); 21 clientnum++; //增加客戶計數 22 } 23 serverSocket.close(); //關閉ServerSocket 24 } 25 }

客戶端執行緒

 1 package
test; 2 3 import java.io.*; 4 import java.net.*; 5 public class ServerThread extends Thread{ 6 Socket socket=null; //儲存與本執行緒相關的Socket物件 7 int clientnum; //儲存本程序的客戶計數 8 public ServerThread(Socket socket,int num) { //建構函式 9 this.socket=socket; //初始化socket變數 10 clientnum=num+1; //初始化clientnum變數 11 } 12 public void run() { //執行緒主體 13 try{ 14 String line; 15 //由Socket物件得到輸入流,並構造相應的BufferedReader物件 16 BufferedReader is=new BufferedReader(new 17 InputStreamReader(socket.getInputStream())); 18 //由Socket物件得到輸出流,並構造PrintWriter物件 19 PrintWriter os=new PrintWriter(socket.getOutputStream()); 20 //由系統標準輸入裝置構造BufferedReader物件 21 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); 22 //在標準輸出上列印從客戶端讀入的字串 23 System.out.println("Client:"+ clientnum +is.readLine()); 24 //從標準輸入讀入一字串 25 line=sin.readLine(); 26 while(!line.equals("bye")){//如果該字串為 "bye",則停止迴圈 27 os.println(line);//向客戶端輸出該字串 28 os.flush();//重新整理輸出流,使Client馬上收到該字串 29 //在系統標準輸出上列印該字串 30 System.out.println("Server:"+line); 31 //從Client讀入一字串,並列印到標準輸出上 32 System.out.println("Client:"+ clientnum +is.readLine()); 33 line=sin.readLine();//從系統標準輸入讀入一字串 34 }//繼續迴圈 35 os.close(); //關閉Socket輸出流 36 is.close(); //關閉Socket輸入流 37 socket.close(); //關閉Socket 38 }catch(Exception e){ 39 System.out.println("Error:"+e);//出錯,打印出錯資訊 40 } 41 } 42 }

伺服器端

 1 package test;
 2 
 3 import java.io.*;
 4 import java.net.*;
 5 public class TalkClient {
 6     public static void main(String args[]) {
 7         try{
 8             //向本機的4700埠發出客戶請求
 9             Socket socket=new Socket("127.0.0.1",4700);
10             //由系統標準輸入裝置構造BufferedReader物件
11             BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
12             //由Socket物件得到輸出流,並構造PrintWriter物件
13             PrintWriter os=new PrintWriter(socket.getOutputStream());
14             //由Socket物件得到輸入流,並構造相應的BufferedReader物件
15             BufferedReader is=new BufferedReader(new 
16                 InputStreamReader(socket.getInputStream()));
17             String readline;
18             readline=sin.readLine(); //從系統標準輸入讀入一字串
19             while(!readline.equals("bye")){//若從標準輸入讀入的字串為 "bye"則停止迴圈
20                 //將從系統標準輸入讀入的字串輸出到Server
21                 os.println(readline);
22                 os.flush();//重新整理輸出流,使Server馬上收到該字串
23                 //在系統標準輸出上列印讀入的字串
24                 System.out.println("Client:"+readline);
25                 //從Server讀入一字串,並列印到標準輸出上
26                 System.out.println("Server:"+is.readLine());                
27                 readline=sin.readLine(); //從系統標準輸入讀入一字串
28             } //繼續迴圈
29             os.close(); //關閉Socket輸出流
30             is.close(); //關閉Socket輸入流
31             socket.close(); //關閉Socket
32         }catch(Exception e) {
33             System.out.println("Error"+e); //出錯,則打印出錯資訊
34         }
35     }
36 }