Java 初級軟件工程師 認證考試試卷1

Java 初級軟件工程師java

認證考試試卷數據庫

 

筆試(A卷)編程

 

 

考試時間150分鐘設計模式

 

總分 100分數組

 

 

姓    名_______________________安全

身份證號_______________________服務器

 

 

 

考試結束後考卷必須收回,不然考試成績無效網絡

 

 

尚學堂Java 初級軟件工程師認證考試試卷多線程

 

 

1、    填空題(共20個題目,總計20分)oracle

  1. 安裝JDK後,爲了告訴計算機javac.exe和java.exe等執行文件的位置,須要配置的環境變量是______Path_______。
  2. Java提供了三種註釋類型,分別是單行註釋,多行註釋和_____文檔註釋________。
  3. char 類型用來表示在Unicode編碼表中的字符,長度是___2___個字節。
  4. ___&&______是短路與運算符,若是左側表達式的計算結果是false,右側表達式將再也不進行計算。
  5. _____contiune________語句用在循環語句體中,用於終止某次循環過程,即跳過循環體中還沒有執行的語句,接着進行下一次是否執行循環的斷定。
  6. 基本數據類型的類型轉換中,要將double類型的常量3.14159賦給爲整數類型變量n的語句是________int n = int(3.14159);_____________。
  7. 執行Person p = new Person();語句後,將在___堆內存________中給Person對象分配空間,並在棧內存中給引用變量p分配空間,存放Person對象的引用。
  8. 使用static修飾的變量稱爲靜態變量,靜態變量能夠有兩種訪問方式,分別是類名.靜態變量名和_______對象名.靜態變量名________________。
  9. 在一個類文件中的關鍵字package,import,class出現的可能順序是________________package,import,class______________。
  10. 異常是由Java應用程序拋出和處理的非嚴重錯誤,好比所需文件沒有找到、零做除數,數組下標越界等,可分爲兩類:Checked異常和__運行時異常(RuntimeException)________________。
  11. 數組在內存中分配連續的空間,數組的長度固定,一經分配沒法改變,可使用___length_________屬性獲取數組的長度。
  12. DateFormat類能夠實現字符串和日期類型之間的格式轉換,其中將日期類型轉換爲指定的字符串格式的方法名是_____Forma_________。
  13. JDK1.5後提供了____enum________關鍵字,用以定義枚舉類。枚舉類是一種特殊的類,能夠有本身的屬性、方法和構造方法。
  14. 若是但願將自定義類Student的多個對象放入集合TreeSet,實現全部元素按照某個屬性的天然順序排列,則須要Student類實現___Comparabe_______________接口。
  15. 迭代器Iterator爲集合而生,專門實現集合遍歷,該接口有三個方法,分別是hasNext() 、___next()_________、remove()。
  16. Java IO體系中,__DataInputStream__________________是字節輸入流,提供了能夠存取全部Java基礎類型數據(如:int,double 等)和String的方法,但沒有提供存取對象的方法。
  17. ____序列化________是指將Java對象轉換成字節序列,從而能夠保存到磁盤上,也能夠在網絡上傳輸,使得不一樣的計算機能夠共享對象。
  18. Java反射技術中,每一個Method對象對應一個方法,得到Method對象後,能夠調用其__invoke_________來調用對應方法。
  19. 處於運行狀態的線程在某些狀況下,如執行了sleep(睡眠)方法,或等待I/O設備等資源,將讓出CPU並暫時中止本身的運行,進入____阻塞_____狀態。
  20. 統一資源定位符URL是指向互聯網「資源」的指針,由4部分組成:協議、存放資源的主機域名、____端口號______和資源路徑和文件名。

2、    選擇題(共25個題目,總計25分)

1)

如下選項中是對一個Java源文件進行正確編譯的語句是( A   (選擇一項)

 

 

 

 

A.

javac Test.java

 

B.

javac Test

 

C.

java Test

 

D.

java Test.class

2)

如下選項中屬於合法的Java標識符的是(CD    。(選擇項)

 

 

 

 

A.

public

 

B.

3num

 

C.

name

 

D.

_age

3)

如下代碼的執行結果是(  B  。(選擇一項)

 

boolean m = true;

if(m = false){

    System.out.println("false");

}else{

    System.out.println("true");

}

 

 

 

 

A.

false

 

B.

true

 

C.

編譯錯誤

 

D.

無結果

4)

如下do-while循環代碼的執行結果是( A   。(選擇一項)

 

int a=0;

int c=0;

do{

    --c;

    a=a-1;

}while(a>0);

System.out.println(a+"  "+c);

 

 

 

 

A.

-1  -1

 

B.

死循環

 

C.

-1  -2

 

D.

-1  0

5)

while循環和do-while循環的區別是( D   。(選擇一項)

 

 

 

 

A.

沒有區別,這兩個結構在任何狀況下效果同樣

 

B.

while循環比do-while循環執行效率高

 

C.

while循環是先循環後判斷,因此循環體至少被執行一次

 

D.

do-while循環是先循環後判斷,因此循環體至少被執行一次

6)

分析下面的Java多重循環代碼片斷,編譯運行後的輸出結果是( D   。(選擇一項)

 

for (int i = 0; i < 6; i++) {

    int k = ++i;

    while (k < 5) {

       System.out.print(i);

       break;

    }

}

 

 

 

 

A.

024

 

B.

02

 

C.

123

 

D.

13

7)

如下關於方法調用的代碼的執行結果是(   B 。(選擇一項)

 

public class Test {

    public static void main(String args[]) {

       int i = 99;

       mb_operate(i);

       System.out.print(i + 100);

    }

    static void mb_operate(int i) {

       i += 100;

    }

}

 

 

 

 

A.

99

 

B.

199

 

C.

299

 

D.

99100

8)

如下關於繼承條件下構造方法執行過程的代碼的執行結果是(  A  。(選擇一項)

 

class Person {   

    public Person() {

       System.out.println("execute Person()");1

    }

}

class Student extends Person { 

    public Student() {      

       System.out.println("execute Student() ");2

    }  

}

class PostGraduate extends Student {  

    public PostGraduate() { 

       System.out.println("execute PostGraduate()");3

    }  

}

public class TestInherit {

    public static void main(String[] args) {

       new PostGraduate();     

    }

}

 

 

 

 

A.

execute Person()

execute Student()

execute PostGraduate()

 

B.

execute PostGraduate()

 

C.

execute PostGraduate()

execute Student()

execute Person()

 

D.

沒有結果輸出

9)

如下語句中關於Java構造方法的說法錯誤的是(  B  。(選擇一項)

 

 

 

 

A.

構造方法的做用是爲建立對象進行初始化工做,好比給成員變量賦值

 

B.

一個Java類能夠沒有構造方法,也能夠提供1個或多個構造方法

 

C.

構造方法與類同名,不能書寫返回值類型

 

D.

構造方法的第一條語句若是是super(),則能夠省略,該語句做用是調用父類無參數的構造方法

10)

如下關於thissuper關鍵字的說法錯誤的是(  BD  。(選擇二項)

 

 

 

 

A.

this關鍵字指向當前對象自身,super關鍵字指向當前對象的直接父類

 

B.

在main方法中能夠存在this或super關鍵字,但不能同時存在。

 

C.

this和super關鍵字均可以訪問成員屬性,成員方法和構造方法

 

D.

在一個類的構造方法中能夠同時使用this和super來調用其餘構造方法

11)

如下選項中可使成員變量m 被函數fun()直接訪問的是(  C  。(選擇一項)

 

class Test {

    private int m;

    public static void fun() {     

       System.out.println(m);

    }

}

 

 

 

 

A.

將private int m 改成protected int m

 

B.

將private int m 改成 public int m

 

C.

將private int m 改成 static int m

 

D.

將private int m 改成 int m

12)

Person類和Test類的代碼以下所示,則代碼中的錯誤語句是( C   。(選擇一項)

 

public class Person {

    public String name;

    public Person(String name) {

       this.name = name;

    }

}

public class Test {

    public static void main(String[] args) {

        final Person person = new Person("歐歐");

        person.name = "美美";

        person = new Person("亞亞");

    }

}

 

 

 

 

 

A.

 

final Person person = new Person("歐歐");

 

B.

person.name = "美美";

 

C.

person = new Person("亞亞");

 

D.

沒有錯誤

13)

如下關於異常的代碼的執行結果是(  C  。(選擇一項)

 

public class Test {

    public static void main(String args[]) {

       try {

           System.out.println("try");        

           return;

       } catch(Exception e){

           System.out.println("catch");

       }finally {

           System.out.println("finally");

       }

    }

}

 

 

 

 

A.

try

catch

finally

 

B.

catch

finally

 

C.

try

finally

 

D.

try

 

14)

如下關於String類的代碼的執行結果是( B   。(選擇一項)

 

public class Test2 {

    public static void main(String args[]) {

        String s1 = new String("bjsxt");

        String s2 = new String("bjsxt");

        if (s1 == s2)

            System.out.println("s1 == s2");

        if (s1.equals(s2))

            System.out.println("s1.equals(s2)");

    }

}

 

 

 

 

A.

s1 == s2

 

B.

s1.equals(s2)

 

C.

s1 == s2

s1.equals(s2)

 

D.

以上都不對

 

 

15)

如下關於StringBuffer類的代碼的執行結果是(  D  。(選擇一項)

 

public class TestStringBuffer {

    public static void main(String args[]) {

       StringBuffer a = new StringBuffer("A");

       StringBuffer b = new StringBuffer("B");

       mb_operate(a, b);

       System.out.println(a + "." + b);

    }

    static void mb_operate(StringBuffer x, StringBuffer y) {

       x.append(y);

       y = x;

    }

}

 

 

 

 

A.

A.B 

 

B.

A.A

 

C.

AB.AB

 

D.

AB.B

16)

如下選項中可以正確建立一個數組的是( AD   。(選擇二項)

 

 

 

 

A.

float []f[] = new float[6][6];

 

B.

float f[][] = new float[][];

 

C.

float [6][]f = new float[6][6];

 

D.

float [][]f = new float[6][];

17)

如下選項中關於intInteger的說法錯誤的是(  BD。(選擇二項)

 

 

 

 

A.

int是基本數據類型,Integer是int的包裝類,是引用數據類型

 

B.

int的默認值是0,Integer的默認值也是0

 

C.

Integer能夠封裝了屬性和方法提供更多的功能

 

D.

Integer i=5;該語句在JDK1.5以後能夠正確執行,使用了自動拆箱功能

18)

如下選項中關於Java集合的說法錯誤的是( AC   。(選擇二項)

 

 

 

 

A.

List接口和Set接口是Collections接口有兩個子接口

 

B.

List接口中存放的元素具備有序,不惟一的特色

 

C.

Set接口中存放的元素具備無序,不惟一的特色

 

D.

Map接口存放的是映射信息,每一個元素都是一個鍵值對

19)

如下代碼的執行結果是(B 。(選擇一項)

 

Set<String> s=new HashSet<String>();

s.add("abc");

s.add("abc");

s.add("abc");

s.add("abcd");

System.out.println(s.size());

 

 

 

 

A.

1

 

B.

2

 

C.

3

 

D.

4

20)

下面集合類中屬於非線程安全,且結構採用了哈希表的是( C 。(選擇一項)

 

 

 

 

A.

Vector

 

B.

ArrayList

 

C.

HashMap

 

D.

Hashtable

21)

如下選項中關於以下代碼的說法正確的是(  AD。(選擇二項)

 

public class TestBuffered {

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

       BufferedReader br =

           new BufferedReader(new FileReader("d:/bjsxt1.txt"));

       BufferedWriter bw =

           new BufferedWriter(new FileWriter("d:/bjsxt2.txt"));

       String str = br.readLine();

       while(str !=null){

           bw.write(str);

           bw.newLine();

           str = br.readLine();

       }

       br.close();

       bw.close();  

    }

}

 

 

 

 

A.

該類使用字符流實現了文件複製,將d:/bjsxt1.txt複製爲d:/bjsxt2.txt

 

B.

FileReader和FileWriter是處理流,直接從文件讀寫數據

 

C.

BufferedReader和BufferedWriter是節點流,提供緩衝區功能,提升讀寫效率

 

D.

readLine()能夠讀取一行數據,返回值是字符串類型,簡化了操做

22)

InputStreamReader是轉換流,能夠將字節流轉換成字符流,是字符流與字節流之間的橋樑。它的實現使用的設計模式是( C  。(選擇一項)

 

 

 

 

A.

工廠模式

 

B.

裝飾模式

 

C.

適配器模式

 

D.

代理模式

23)

如下選項中能夠填寫到橫線處,讓代碼正確編譯和運行的是( A   。(選擇一項)

 

public class Test implements Runnable {

    public static void main(String[] args) {

       ___________________________________

       t.start();

       System.out.println("main");

    }

    public void run() {

       System.out.println("thread1!");

    }

}

 

 

 

 

A.

Thread t = new Thread(new Test());

 

B.

Test t = new Test();

 

C.

Thread t = new Test();             

 

D.

Thread t = new Thread();

24)

在多個線程訪問同一個資源時,可使用(  A  關鍵字來實現線程同步,保證對資源安全訪問。(選擇一項)

 

 

 

 

A.

synchronized

 

B.

transient

 

C.

static

 

D.

yield

25)

如下說法中關於UDP協議的說法正確的是(  AD  。(選擇二項)

 

 

 

 

A.

發送無論對方是否準備好,接收方收到也不確認

 

B.

面向鏈接

 

C.

佔用系統資源多、效率低

 

D.

很是簡單的協議,能夠廣播發送

       

 

3、    判斷題(共20個題目,總計10分)

  1. 一個Java源文件中能夠定義多個類,可是至多隻能有一個public類。(T )
  2. Java的字節碼文件的擴展名是class,是一種平臺獨立的非二進制文件。( F  )
  3. ^ 是異或位運算符,運算規則是若是兩個操做數相同,結果是0,不然結果是1。( T )
  4. 賦值運算符優先級別低於條件運算符,條件運算符優先級別低於算術運算符。( T  )
  5. switch選擇語句是多分支選擇語句,只能處理等值條件判斷的狀況,表達式能夠是int類型、char類型,但不能是double,float類型。( T  )
  6. 在多重循環中,外層循環變量變化一遍,內層循環變量要變化一次 。( F  )
  7. 程序調用自身的編程技巧稱爲遞歸。遞歸的特色是編程簡單而且節省內存。(  F )
  8. 類能夠當作一類對象的模板,對象能夠當作該類的一個具體實例。( T  )
  9. 使用public修飾的成員屬性和方法能夠被當前項目中全部包的全部類訪問。( T  )
  10. 將子類對象賦給父類引用變量,稱爲向下轉型,將沒法訪問子類特有的方法。( F  )
  11. 繼承是多態的基礎,沒有繼承就沒有多態。(  T )
  12. 內部類做爲外部類成員,權限修飾符和其餘成員同樣,可聲明爲private、默認、protected或public。(  T )
  13. 對於物理鏈接,好比數據庫鏈接、輸入流輸出流、Socket鏈接等,垃圾回收機制無能爲力,必須手動關閉才能夠。(  T )
  14. 數組和集合中的元素能夠是任何數據類型,包括基本類型和引用類型。( F  )
  15. 加強的for循環能夠遍歷數組和集合,語法簡單 不須要知道數組的長度,不能實現與下標相關的操做。(  T )
  16. LinkedHashMap是一種有序的HashMap,查詢速度快,便於進行添加刪除操做。( T  )
  17. Collection類是專門用來操做集合的工具類,提供一系列靜態方法實現對各類集合的操做。(  F )

Collection是接口類型,存放單值的最大接口;
 Collections是操做集合的工具類,就像數組同樣,Arrays類是數組工具類。

  1. 一個File對象能夠表明一個文件或目錄,它能夠獲取文件和目錄屬性,也能夠訪問文件內容。F )
  2. 進程是線程Thread內部的一個執行單元,它是程序中一個單一順序控制流程。( F  )
  3. Socket是傳輸層供給應用層的編程接口,是應用層與傳輸層之間的橋樑 。(  T )

 

4、    簡答題(共5個題目,總計25分)

  1. 方法重載和方法重寫(覆蓋)的區別。(4分)

 

英文

位置不一樣

修飾符

返回值

方法名

參數

拋出異常

方法體

重載

overload

同一個類中

無關

無關

相同

不一樣

無關

不一樣

重寫

override

子類和父類間

大於等於

小於等於

相同

相同

小於等於

不一樣

 

    答:

    (1)相同點:

    ①方法名稱相同。

    ②都屬於多態機制。

    (2不一樣點:位置、參數列表、權限修飾符、返回值類型、拋出異常不一樣。

    重載(overload)發生在同一個類中,方法名相同,參數列表不一樣,與權限修飾、返回值類型、拋出異常無關。

    重寫(override): 發生在繼承類中,方法名和參數列表相同,權限修飾符大於等於父類、返回值類型小於等於父類、拋出異常小於等於父類。

 

  1. 寫出java.lang.Object類的六個經常使用方法的聲明並說明其做用。(6分)

    1)       public boolean equals(java.lang.Object) 比較內容

    2)       public native int hashCode() 哈希碼

    3)       public java.lang.String toString() 變成字符串

    4)       public final native java.lang.Class getClass() 獲取類結構信息

    5)       protected void finalize() throws java.lang.Throwable 垃圾回收前執行的方法

    6)       protected native Object clone() throws java.lang.CloneNotSupportedException 克隆

    7)       public final void wait() throws java.lang.InterruptedException 多線程中等待功能

    8)       public final native void notify() 多線程中喚醒功能

    9)        public final native void notifyAll() 多線程中喚醒全部等待線程的功能

  1. 接口和抽象類的聯繫和區別。(5分)

    相同點

  • 抽象類和接口均包含抽象方法,類必須實現全部的抽象方法,不然是抽象類
  • 抽象類和接口都不能實例化,他們位於繼承樹的頂端,被其餘類繼承和實現

    二者的區別主要體如今兩方面:語法方面和設計理念方面

    語法方面的區別是比較低層次的,非本質的,主要表如今:(2分)

  • 接口中只能定義全局靜態常量,不能定義變量。抽象類中能夠定義常量和變量。
  • 接口中全部的方法都是全局抽象方法。抽象類中能夠有0個、1個或多個,甚至所有都是抽象方法。
  • 抽象類中能夠有構造方法,但不能用來實例化,而在子類實例化時執行,完成屬於抽象類的初始化操做。接口中不能定義構造方法。
  • 一個類只能有一個直接父類(能夠是抽象類),但能夠充實實現多個接口。一個類使用extends來繼承抽象類,使用implements來實現接口。

    兩者的主要區別在設計理念上,決定了某些狀況下使用抽象類仍是接口。(2分)

  • 抽象類體現了一種繼承關係,目的是複用代碼,抽象類定義了各個子類的相同代碼,可認爲父類是一個實現了部分功能的「中間產品」,而子類是「最終產品」。父類和子類間須存在「is-a」關係,即父類和子類在概念本質上是相同的。

    接口並不要求實現類和接口在概念本質上一致,僅僅是實現了接口定義的約定或能力而已。接口定義了「作什麼」,實現類負責完成「怎麼作」,體現了功能(規範)和實現分離的原則。接口和實現之間能夠認爲是一種「has-a的關係

 

    一、抽象類和接口都不能直接實例化,若是要實例化,抽象類變量必須指向實現全部抽象方法的子類對象,接口變量必須指向實現全部接口方法的類對象。

    二、抽象類要被子類繼承,接口要被類實現。

    三、接口只能作方法申明,抽象類中能夠作方法申明,也能夠作方法實現

    四、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。

    五、抽象類裏的抽象方法必須所有被子類所實現,若是子類不能所有實現父類抽象方法,那麼該子類只能是抽象類。一樣,一個實現接口的時候,如不能所有實現接口方法,那麼該類也只能爲抽象類。

    六、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果

    七、抽象類裏能夠沒有抽象方法

    八、若是一個類裏有抽象方法,那麼這個類只能是抽象類

    九、抽象方法要被實現,因此不能是靜態的,也不能是私有的。

    十、接口可繼承接口,並可多繼承接口,但類只能單根繼承。

 

  1. Vector和ArrayList、ArrayList和LinkedList的區別和聯繫。(6分)

    VectorArrayList的區別和聯繫

    實現原理相同,功能相同,都是長度可變的數組結構,不少狀況下能夠互用(1分)

    二者的主要區別以下

  1. Vector是早期JDK接口,ArrayList是替代Vector的新接口(0.5分)
  2. Vector線程安全,ArrayList重速度輕安全,線程非安全(1分)
  3. 3.       長度需增加時,Vector默認增加一倍,ArrayList增加50%(0.5分)

    ArrayListLinkedList的區別和聯繫

    ArrayList和LinkedList都是List的實現類,元素具備有序,不惟一特色。(1分)

    ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素的效率比較高;(1分)

 

    LinkedList採用鏈表存儲方式。插入、刪除元素時效率比較高(1分)

 

 

  1. 面向對象設計原則有哪些。(4分)

    面向對象設計原則是面向對象設計的基石,面向對象設計質量的依據和保障,設計模式是面向對象設計原則的經典應用

  1. 單一職責原則SRP
  2. 開閉原則OCP
  3. 里氏替代原則LSP
  4. 依賴注入原則DIP
  5. 接口分離原則ISP
  6. 迪米特原則LOD
  7. 組合/聚合複用原則CARP

開閉原則具備理想主義的色彩,它是面向對象設計的終極目標。其餘設計原則均可以看做是開閉原則的實現手段或方法。

  1 1、    編碼題(共3個題目,總計20分)
  2 1.    寫出餓漢式單例模式、懶漢式單例模式、多線程狀況下懶漢式雙重判斷單例模式的示例代碼。(7分)
  3 
  4 public class Student_1 {
  5     //餓漢式
  6     private static Student_1 student = new Student_1();
  7 
  8     public static Student_1 newInstance() {
  9         return student;
 10     }
 11 
 12     public Student_1() {
 13         System.out.println("餓漢式建立對象");
 14     }
 15 
 16 }
 17 
 18 class Student_2 {
 19     //懶漢式
 20     private static Student_2 student2;
 21 
 22     static Student_2 newInstance2() {
 23     //提升效率,若是第一次建立對象成功,後面就不用進入同步當中,直接返回對象便可
 24         if (student2 == null) {
 25             synchronized (Student_1.class) {
 26                 //若是是第一次調用方法,進入if,建立對象
 27                 if (student2 == null) {
 28                     student2 = new Student_2();
 29                 }
 30             }
 31         }
 32         return student2;
 33     }
 34 
 35     public Student_2() {
 36         System.out.println("懶漢式雙重檢驗建立對象");
 37     }
 38     
 39 }
 40 public class Danli_1 {
 41   
 42     public static void main(String[] args) {
 43         Student_1 s =Student_1.newInstance();
 44         
 45         Student_2 s2 =Student_2.newInstance2();
 46         
 47     }
 48 }
 49 
 50 2.    寫出使用JDBC訪問數據庫表t_student中全部數據,並將結果集內容封裝成List返回的代碼。(6分)
 51 1)    數據庫表已經建立,表名稱及字段信息以下
 52 表名    t_student    中文表名稱    學生信息表
 53 序號    字段名稱    字段說明    類型    長度    備註
 54 1    id    學生編號    number    6    主鍵
 55 2    name    學生姓名    varchar2    8    非空
 56 3    age    學生年齡    number    3    非空
 57 4    score    學生分數    number    5,1    非空
 58 5    enterdate    入學時間    date        非空
 59 2)    實體類Student已經提供,和數據庫表字段對應,有id,name,age,score,enterDate五個屬性及相應的getter和setter方法,提供了各類參數的構造方法。
 60 3)    使用JDBC訪問數據庫四個鏈接參數分別爲
 61 a)    driver:oracle.jdbc.driver.OracleDriver
 62 b)    url:jdbc:oracle:thin:@localhost:1521:orcl
 63 c)    username:bjsxt
 64 d)    password:bjsxt                
 65 4)    方法的聲明爲public List<Student> findAll(){ },在方法體中書寫JDBC代碼完成功能便可。
 66 3.    使用TCP網絡編程完成用戶登陸功能:客戶端輸入用戶名和密碼,向服務器發出登陸請求;服務器接收數據並進行判斷,若是用戶名和密碼均是bjsxt,則登陸成功,不然登陸失敗,返回相應響應信息;客戶端接收響應信息並輸出登陸結果。(7分)
 67 1)    用戶User類已提供構造方法 public User(String username,String password)。
 68 2)    客戶端採用ObjectOutputStream發送封裝了用戶名和密碼的User對象。
 69 3)    服務器端和客戶端的類名和方法聲明以下所示。
 70 
 71 import java.io.BufferedReader;
 72 import java.io.BufferedWriter;
 73 import java.io.IOException;
 74 import java.io.InputStreamReader;
 75 import java.io.OutputStreamWriter;
 76 import java.net.Socket;
 77 import java.util.Scanner;
 78 
 79 public class UserClint_3 {
 80     static Scanner sc = new Scanner(System.in);
 81     public static void main(String[] args) throws IOException {
 82         //1.建立客戶端套接字
 83         Socket s = new Socket("localhost", 152);
 84         //2.建立客戶端輸出流
 85         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 86         //3.用戶輸入用戶和密碼,並寫入輸出流
 87         System.out.println("請輸入用戶名:");
 88         String user = sc.nextLine();
 89         System.out.println("請輸入用戶密碼:");
 90         String password = sc.nextLine();
 91         bw.write(user);
 92         bw.flush();
 93         bw.newLine();
 94         bw.write(password);
 95         bw.flush();
 96         
 97         //4.通知服務端客戶端用戶信息寫入完畢
 98         s.shutdownOutput();
 99         
100         //5.建立輸入流來接受服務端響應的信息
101         BufferedReader br=  new BufferedReader(new InputStreamReader(s.getInputStream()));
102         String info = br.readLine();
103         //6.輸出響應信息
104         System.out.println(info);
105         //7.關閉套接字
106         s.close();
107     }
108 }
109 
110 import java.io.BufferedReader;
111 import java.io.BufferedWriter;
112 import java.io.FileInputStream;
113 import java.io.IOException;
114 import java.io.InputStreamReader;
115 import java.io.OutputStreamWriter;
116 import java.net.ServerSocket;
117 import java.net.Socket;
118 import java.util.HashMap;
119 import java.util.Map;
120 import java.util.Properties;
121 
122 public class UserServer_3 {
123     public static Map<String, String> User() throws  IOException{
124         //將用戶信息存放在User.properties文件中
125         //建立properties類獲取用戶信息
126         Properties p = new Properties();
127         //經過load()方法讀取用戶信息
128         p.load(new FileInputStream("User.Properties"));
129         //經過getProperty()方法獲取用戶信息的鍵,獲得用戶信息的值
130         String user = p.getProperty("username");
131         String pwd = p.getProperty("pwd");
132         
133         //建立map集合,將用戶信息的鍵以及對應的值放入集合中
134         Map<String, String> map = new HashMap<>();
135         map.put("username", user);
136         map.put("pwd", pwd);
137         return map;
138     }
139     public static void main(String[] args) throws IOException {
140         //1.建立服務器端套接字
141         ServerSocket ss = new ServerSocket(152);
142         //2.監聽客戶端套接字
143         Socket s = ss.accept();
144         //3.建立輸入流用來讀取客戶端發送的用戶信息
145         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
146         //4.讀取客戶端發送的用戶信息
147         String username = br.readLine();
148         String password = br.readLine();
149         
150         //5.調用map集合,拿到map集合裏面的用戶信息和客戶端發送的信息進行比對
151         Map<String, String> map = User();
152         //6.建立輸出流用來響應客戶端
153         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
154         //7.進行信息比對
155         if(map.get("username").equals(username)&&map.get("pwd").equals(password)){
156             //8.寫入響應信息
157             bw.write("恭喜您,登陸成功!");
158             bw.flush();
159         }else{
160             bw.write("登陸失敗,用戶或用戶密碼錯誤!");
161             bw.flush();
162         }
163         //9.關閉客戶端套接字
164         s.close();
165     }
166 }
相關文章
相關標籤/搜索