既然要架設伺服器,首先當然得要了解一下網際網路。因為不管是哪種作業系統,若想要與網際網路聯機,這個網絡基礎就得了解。 舉例來說,『網域』是經常會談到的概念,當你發現一個設定為 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"/>