該示例實現的功能是質數判斷,程序實現的功能為客戶端程序接收用戶輸入的數字,然後將用戶輸入的內容發送給服務器端,服務器端判斷客戶端發送的數字是否是質數,並將判斷的結果反饋給客戶端,客戶端根據服務器端的反饋顯示判斷結果。
質數的規則是:最小的質數是2,只能被1和自身整除的自然數。當用戶輸入小於2的數字,以及輸入的內容不是自然數時,都屬於非法輸入。
網絡程序的功能都分為客戶端程序和服務器端程序實現,下面先描述壹下每個程序分別實現的功能:
1、 客戶端程序功能:
a) 接收用戶控制臺輸入
b) 判斷輸入內容是否合法
c) 按照協議格式生成發送數據
d) 發送數據
e) 接收服務器端反饋
f) 解析服務器端反饋信息,並輸出
2、 服務器端程序功能:
a) 接收客戶端發送數據
b) 按照協議格式解析數據
c) 判斷數字是否是質數
d) 根據判斷結果,生成協議數據
e) 將數據反饋給客戶端
分解好了網絡程序的功能以後,就可以設計網絡協議格式了,如果該程序的功能比較簡單,所以設計出的協議格式也不復雜。
客戶端發送協議格式:
將用戶輸入的數字轉換為字符串,再將字符串轉換為byte數組即可。
例如用戶輸入16,則轉換為字符串“16”,使用getBytes轉換為byte數組。
客戶端發送“quit”字符串代表結束連接
服務器端發送協議格式:
反饋數據長度為1個字節。數字0代表是質數,1代表不是質數,2代表協議格式錯誤。
例如客戶端發送數字12,則反饋1,發送13則反饋0,發送0則反饋2。
功能設計完成以後,就可以分別進行客戶端和服務器端程序的編寫了,在編寫完成以後聯合起來進行調試即可。
下面分別以TCP方式和UDP方式實現該程序,註意其實現上的差異。不管使用哪種方式實現,客戶端都可以多次輸入數據進行判斷。對於UDP方式來說,不需要向服務器端發送quit字符串。
以TCP方式實現的客戶端程序代碼如下:
package example1;
import java.io.*;
import java.net.*;
/**
* 以TCP方式實現的質數判斷客戶端程序
*/
public class TCPPrimeClient {
static BufferedReader br;
static Socket socket;
static InputStream is;
static OutputStream os;
/**服務器IP*/
final static String HOST = “127.0.0.1”;
/**服務器端端口*/
final static int PORT = 10005;
public static void main(String[] args) {
init(); //初始化
while(true){
System.out.println(”請輸入數字:”);
String input = readInput(); //讀取輸入
if(isQuit(input)){ //判讀是否結束
byte[] b = “quit”.getBytes();
send(b);
break; //結束程序
}
if(checkInput(input)){ //校驗合法
//發送數據
send(input.getBytes());
//接收數據
byte[] data = receive();
//解析反饋數據
parse(data);
}else{
System.out.println(”輸入不合法,請重新輸入!”);
}
}
close(); //關閉流和連接
}
/**
* 初始化
*/
private static void init(){
try {
br = new BufferedReader(
new InputStreamReader(System.in));
socket = new Socket(HOST,PORT);
is = socket.getInputStream();
os = socket.getOutputStream();
} catch (Exception e) {}
}
/**
* 讀取客戶端輸入
*/
private static String readInput(){
try {
return br.readLine();
} catch (Exception e) {
return null;
}
}
/**
* 判斷是否輸入quit
* @param input 輸入內容
* @return true代表結束,false代表不結束
*/
private static boolean isQuit(String input){
if(input == null){
return false;
}else{
if(”quit”.equalsIgnoreCase(input)){
return true;
}else{
return false;
}
}
}
/**
* 校驗輸入
* @param input 用戶輸入內容
* @return true代表輸入符合要求,false代表不符合
*/
private static boolean checkInput(String input){
if(input == null){
return false;
}
try{
int n = Integer.parseInt(input);
if(n >= 2){
return true;
}else{
return false;
}
}catch(Exception e){
return false; //輸入不是整數
}
}
/**
* 向服務器端發送數據
* @param data 數據內容
*/
private static void send(byte[] data){
try{
os.write(data);
}catch(Exception e){}
}
/**
* 接收服務器端反饋
* @return 反饋數據
*/
private static byte[] receive(){
byte[] b = new byte[1024];
try {
int n = is.read(b);
byte[] data = new byte[n];
//復制有效數據
System.arraycopy(b, 0, data, 0, n);
return data;
} catch (Exception e){}
return null;
}
/**
* 解析協議數據
* @param data 協議數據
*/
private static void parse(byte[] data){
if(data == null){
System.out.println(”服務器端反饋數據不正確!”);
return;
}
byte value = data[0]; //取第壹個byte
//按照協議格式解析
switch(value){
case 0:
System.out.println(”質數”);
break;
case 1:
System.out.println(”不是質數”);
break;
case 2:
System.out.println(”協議格式錯誤”);
break;
}
}
/**
* 關閉流和連接
*/
private static void close(){
try{
br.close();
is.close();
os.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
分類: Unix
五個必須立刻實施的Windows組策略選項
作為微軟集中管理解決方案的組策略今年將慶祝它的10周歲生日。在管理上讓人感到驚奇的是,微軟並沒有因為這個方案增加額外的成本,我仍然對組策略在當今的IT界沒有得到足夠的使用而感到詫異。它在同Windows 2000 Server壹起發布後,通過10年的研討會、會議講座、書籍以及培訓而變得很顯然。
在Windows Server 2008的功能集合裏面添加了新的組策略選項(GPPs)。在這樣壹篇文章中,可能不必解釋GPPs是什麽以及它們是如何工作的,重要的是這些“可選的(如果您想要這樣的話)”的配置項目是如何實際地幫助Windows域解決問題的。
考慮到這壹點,讓我們來看看那五個必須實現的組策略選項。壹旦您明白了它們能做什麽,您壹定會發現,它們非常適合您的環境。
用戶配置 | 因特網設置
第壹個設置可能是到目前為止最痛苦的壹個集中設置。基於其原始的界面以及完全的成功需要客戶能實際保持您想要的設置,通過傳統的組策略對Internet Explorer(IE)的內部設置進行配置歷來就是壹個噩夢。
早先Internet Explorer維護控制臺的問題圍繞於傳統的組策略本身的局限性。使用該工具配置IE設置可以讓您從壹個樣機(即正在運行控制臺的機器)導入客戶設置 ——真的沒有其它東西了。這種錯綜復雜的接口往往強迫管理員在僅僅試圖去查看什麽設置被配置時,無意地進行了更改。
通過基於您想要配置的版本,對實際的IE屬性屏幕的操作,會讓對組策略選項(GPPs)的配置設置變得更符合邏輯。此外,GPPs可以在保持壹些選項為必須的同時,讓壹些設置為可選。它們也有精確和易於使用的定位能力,以確保您將正確的設置發送到合適的計算機。
用戶配置 | 驅動映射
在壹個沒有對組策略選項提供支持的環境裏,之所以保留登錄腳本,其最大的原因是對驅動映射的需要。用戶習慣於將H:作為主驅動,S:作為共享驅動(或其它任何您記住的名字)。當他們更換計算機時,需要對驅動器名進行重新設置,這讓他們很沮喪。
使用用戶配置下的驅動映射GPP,可以確保目標驅動器是基於它們是誰而不是它們在哪兒映射到用戶集合。這對傳統的需要手寫並針對特定機器的登錄腳本來說是壹個大大的改進。
進壹步講,組策略選項不僅能創建並管理驅動映射,而且當您完成工作或者需要進行更改時,也可以對其進行移除。使用GPPs,您可以簡單地通過修改驅動映射下的資源,來對其進行重配置。由於組策略處理延遲時間很少,您的用戶會擁有壹個幾乎無縫地訪問所需數據的解決方案。
計算機配置 | 服務
在計算機配置下還會發現另外壹個用於管理服務,以及它們的啟動模式、賬戶和恢復選項的增強工具。
如果您有壹個需要對服務進行特別管理的安全政策或者兼容規則(在如今誰不需要這麽做了?),您會發現服務GPP顯著地提高了服務被正確配置的保證度。這個組策略選項有壹個屬性對話框,呈現域內的知名服務,為配置提供區域,並像所有的CPPs壹樣可以被設為可選或者所需的配置以及非常具體的任務。
此外,如果您的審核員需要看到您正確配置服務的可核實的證據,能用您的CPP設置本身來確切地看到:什麽服務被鎖定了、其原因是什麽。
計算機配置 | 本地用戶和組
幾乎每壹個IT環境中,都有將客戶的用戶和組轉移到本地用戶和組控制臺以進行管理的需求。雖然每壹個用戶或者他/她的計算機都有個別的需求,幾乎每壹個環境都想將壹個“本地IT”全局組添加到管理員組,以確保非域的技術人員可以對桌面進行訪問。
用其它工具做這個歷來就很難。許多環境都糾結於,在外出時,將組任務添加到他們的參考圖像或者構建過程這壹問題。壹些更聰明的解決方案利用腳本來解決問題。
通過使用標記到本地計算機的組策略選項,您現在可以利用壹個簡單的屏幕就將正確的用戶和組添加到目標計算機。有了這個控制臺,您只需要添加組名和它們的成員,然後為GPP設置合適的計算機權限。接著,您就可以獲取所需的訪問,並可以在長期內確保其存在。
用戶配置 | 數據源
最後是為數據庫驅動應用程序配置數據源這個多年的頑疾。即使是最堅毅的IT專業人員在回憶如何正確的設置計算機的ODBC連接時,有時也會抓頭皮。但當您可以壹次創建壹個ODBC連接並提供給需要它的用戶時,對於單獨配置又何必擔憂了?
這種配置可能伴隨著用戶配置下的數據源。使用這個控制臺,可能可以創建ODBC連接、它的DSN、驅動、屬性和登錄信息,並立馬標記到使用的應用程序需要連接的人。如果您的風格是操作大片的機器,也可將數據源作為計算機配置下的壹個組策略選項。
這五個GPPs可以作為您的開始,但它們僅僅是組策略選項可以提供的集中配置的壹小部分……沒有什麽代價!在我的下壹篇文章中,我將更進壹步地介紹任務GPP的細節。您會發現使用這個控制臺(以及壹點指令)的計劃活動是非常容易的。
還原linux系統中的unix格式時間
如在 cat .bash_history 中
看到記錄類型
#1282444399
ls .bashrc
#1282445068
ifconfig
#1282445073
useradd linux
#1282445077
useradd linuxzgf
#1282445090
mkdir linuxzg
#1282445095
mkdir linuxzgf
要還原此類型的日期
用date命令即可
如
當然上面的時間是可以還原到容易識別的方式命令如下
還原#1282445095日期後是
[root@linuxzgf root]# date -d ‘1970-01-01 UTC 1282445095 seconds’
2010年 08月 22日 星期日 10:44:55 CST
[root@linuxzgf root]#