天天看點

Linux distributions DIP依賴倒置原則

既然要架設伺服器,首先當然得要了解一下網際網路。因為不管是哪種作業系統,若想要與網際網路聯機,這個網絡基礎就得了解。 舉例來說,『網域』是經常會談到的概念,當你發現一個設定為 192.168.1.0/255.255.255.0 時,曉得那是什麼鬼東西嗎? 如果不知道的話,呵呵!絕對無法設定好網站的啦!另外,為何你需要伺服器?當然是想要達成某項網絡服務。 舉例來說,傳輸檔案可以用 FTP,那 WWW 可以傳遞檔案嗎?網芳可以傳遞嗎?各有何用處?哪個比較友善? 對于客戶或老闆來說,我們所設定的服務能否滿足他們的需求等等,這都需要了解,否則你将一頭霧水啊! 是以這部份你就得要了解:

基本的網絡基礎知識:包括以太網絡硬體與協定、TCP/IP、網絡聯機所需參數等;

各網絡服務所對應的通訊協定原理,以及各通訊協定所需對應的軟體。

伺服器本身:了解架網絡伺服器之目的以配合主機的安裝規劃

想要架設伺服器嗎?那...架什麼伺服器?這個伺服器要不要對 Internet 開放?這個服務要不要針對客戶提供相關賬号? 要不要針對不同的客戶賬号進行例如磁盤容量、可活動空間與可用系統資源進行限制?如果要進行各項資源的限制, 那伺服器作業系統應該要如何安裝與設定?問題很多吧!是以,先了解你要的伺服器服務目的之後,後續的規劃才能陸續出爐。 不過,如果架站隻是為了『練功』而已,呵呵!那就不需要考慮太多了~

伺服器本身:了解作業系統的基本操作

網絡服務軟體是需要建置在作業系統上面的,是以基本的作業系統操作就得要了解才行啊!包括軟體如何安裝與移除? 如何讓系統進行例行的工作管理?如何依據伺服器服務之目的規劃檔案系統?如何讓檔案系統具有未來擴充性 (LVM 之類)? 系統如何管理各項服務之啟動?系統的開機流程為何?系統出錯時,該如何進行快速複原等等,這都需要了解的呢!

内部防火牆設定:管理系統的可分享資源

一部主機可以擁有多種伺服器軟體的運作,而很多 Linux distributions 出廠的預設值就已經開放很多服務給 Internet 使用了,不過這些服務可能并不是你想要開放的呢。我們在了解網絡基礎與所需服務的目的之後, 接下來就是透過防火牆來規範可以使用本伺服器服務的使用者,以讓系統在使用上擁有較佳的控管情況。 此外,不管你的防火牆系統設定的再怎麼嚴格,隻要是你要開放的服務, 那防火牆對于該服務就沒有保護的效果。是以,那個重要的線上更新軟體機制就一定要定期進行!否則你的系統将會非常非常的不安全!

Android手機的應用,除了它的手機功能之外,另外一個吸引人的地方在于它的開放性,這一點iphone無法比拟,至少iphone太多商業化氣息。android為我們開啟另一扇交流之窗,而要實作交流,socket通信必不可少。

java在socket通信方面上已經有了很好的範例,我隻是抛磚引玉,将其引入到android之中,疏漏之處在所難免,很多地方也值得深思與考量,高手不必拍磚,可跳過此文。下面,用敲門的方式示範Android如何實作套接字的通信。

伺服器程式

伺服器程式需要在PC上運作,該程式比較的簡單,是以不需要建立Android項目,直接定義一個JAVA類,并且運作該類即可。它僅僅建立ServerSocket監聽,并使用Socket擷取輸入輸出流。

[java] view plain copy

import java.io.IOException;  

import java.io.OutputStream;  

import java.net.ServerSocket;  

import java.net.Socket;  

public class SimpleServer {  

    /** 

     * @param args 

     * @throws IOException  

     */  

    public static void main(String[] args) throws IOException {  

        // TODO Auto-generated method stub  

        //建立一個ServerSocket,用于監聽用戶端socket的連接配接請求  

        ServerSocket ss=new ServerSocket(30000);  

        //采用循環不斷接受來自用戶端的請求,伺服器端也對應産生一個Socket  

        while(true){  

            Socket s=ss.accept();  

            OutputStream os=s.getOutputStream();  

            os.write("您好,您收到了伺服器的新年祝福!n".getBytes("utf-8"));  

            os.close();  

            s.close();  

    }  

    }}  

用戶端程式

package my.learn.tcp;  

import java.io.BufferedReader;  

import java.io.InputStreamReader;  

import java.net.UnknownHostException;  

import android.app.Activity;  

import android.os.Bundle;  

import android.util.Log;  

import android.widget.EditText;  

public class SimpleClient extends Activity {  

    private EditText show;  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        show = (EditText) findViewById(R.id.show);  

        try {  

            Socket socket = new Socket("自己計算機的IP位址", 30000);  

            //設定10秒之後即認為是逾時  

            socket.setSoTimeout(10000);  

            BufferedReader br = new BufferedReader(new InputStreamReader(  

                    socket.getInputStream()));  

            String line = br.readLine();  

            show.setText("來自伺服器的資料:"+line);  

            br.close();  

            socket.close();  

        } catch (UnknownHostException e) {  

            // TODO Auto-generated catch block  

            Log.e("UnknownHost", "來自伺服器的資料");  

            e.printStackTrace();  

        } catch (IOException e) {  

            Log.e("IOException", "來自伺服器的資料");  

        }  

}  

需要注意的是,在Manifest.xml檔案當中,需要對網際網路的通路進行授權。

[html] view plain copy

<uses-permission  android:name="android.permission.INTERNET"/>