1. 程式人生 > >Java中利用socket實現簡單的服務端與客戶端的通訊(基礎級)

Java中利用socket實現簡單的服務端與客戶端的通訊(基礎級)

在上一篇文章中,簡單的介紹了java中入門級的socket程式設計,簡單的實現了客戶端像伺服器端傳送資料,伺服器端將資料接收並顯示在控制檯,沒有涉及多執行緒。上一篇文章的連結:Java中利用socket實現簡單的服務端與客戶端的通訊(入門級)

這次,我們將上一節中的程式碼進行少許的更改,將伺服器更改為多執行緒,使得伺服器可以為多個客戶端服務。

因為是伺服器端實現的多執行緒,所以客戶端的程式碼不用做任何更改,和上一篇中的一樣。只需要對服務端的程式碼進行稍許更改即可。

在專案中新建一個類,這個類就是執行緒類,所以要繼承自Thread類,該類的程式碼如下:

package server_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MyThread extends Thread {
	//
	Socket socket=null;
	
	public MyThread(Socket socket) throws Exception{
		this.socket=socket;
	}
    public void run(){
    	BufferedReader in = null;  
    	try {
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //啟動緩衝區 
        //out = new PrintWriter(client.getOutputStream());  
        while (true) {  
              String msg=null;
			try {
				msg = in.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // 將客戶端傳送來的資訊儲存在msg中 
              System.out.println(msg);  
              if (msg.equals("shutdown")) {  //客戶端如果傳送的是shutdown,就關閉客戶端
                    break;  
              }  
         }
         try {
			in.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //執行相應的關閉操作         
    	
    }
    
    	
   
}
在上述程式碼中,MyThread的建構函式將socket傳入類內部的socket中,同時,將通訊的 主要任務都寫在了這個執行緒類中。

以下是主類中的程式碼:

package server_1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class server_1 {  
	public static void main(String[] args) throws Exception { //將異常全部丟擲 
        ServerSocket server = new ServerSocket(10000);    //用serversocket來啟動伺服器,並指定埠號
        System.out.println("伺服器啟動。。。");
        int count=0;
        while(true){
        	Socket socket = server.accept();  //獲取客戶端的socket資訊
            MyThread mythread=new MyThread(socket);
            mythread.start();
            count++;
            System.out.println("客戶端數量為:"+count);
        }
        //server.close();    
            //PrintWriter out = null;  
               
       //}      
    }  
}
可以看到,此次在服務端加了一個沒有退出條件的迴圈操作,迴圈中監聽網路中的socket資訊,當有客戶端連線的時候,就講這個socket傳給一個執行緒去執行,同時顯示出目前連線到服務端的客戶端的數量。

測試時,先執行服務端,然後開啟兩次客戶端,分別像服務端傳送資料,可以看到服務端可以顯示出連線的客戶端的數量,並且可以正常的顯示客戶端傳送過來的資料。

2015年11月19日   西安交通大學