java學習(21)

from: http://android.yaohuiji.com/archives/3668

 

第二十一講:網絡編程(一)

05JAN

lesson21

本講內容: socket 只會裝傻的”智能“機器人

套接字(socket)是代表計算機之間網絡連接的對象。要進行計算機間的網絡通訊,建立TCP連接,那麼就需要Socket編程,Java提供了ServerSocket類和Socket類,可以利用他們很方便的實現,計算機間的網絡通訊。

因爲Java把數據的傳輸已經抽象成InputStream和OutputStream的輸入輸出流,那麼對網絡通訊來說,其實就是利用ServerSocket類和Socket類建立起來網絡連接,進行字節流或者字符流的輸入輸出操作。

下面我們還是通過一個例子來學習Socket編程:只會裝傻的”智能“機器人

直接上代碼,服務器端 TalkServer.java :

 

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 TalkServer {

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

        // 創建一個ServerSocket
        ServerSocket server = new ServerSocket(8080);

        // 準備接受客戶連接,如果有客戶連接到,則創建一個socket對象,如果沒有客戶連接到,
        // 那麼該程序會停在本行一直等待,像是在睡眠或者假死,這種行爲叫做“阻塞”, 
        // 阻塞是網絡通信中的術語,就是你等別人響應,如果必須等到,等不到就一直等,
        // 就是阻塞,等不到也繼續向前走的當然就是非阻塞。
        Socket socket = server.accept();

        // 從socket中獲取一個輸入對象,以便接受從網絡上來的數據
        BufferedReader socketInput = new BufferedReader(newInputStreamReader(socket.getInputStream()));

        // 從標準輸入中獲取一個輸入對象,以便接受從鍵盤上傳來的數據,如果想讓服務器端和客戶端自由對話的話可以用此對象
        //BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));

        // 從socket中獲取一個
        PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

        //定義一些變量
        String input;      

        // 一直執行,直到客戶端表示要斷開
        while(true){
            //從客戶端獲取用戶輸入的字符串
            input = socketInput.readLine();
            //發送到屏幕
            System.out.print("客戶:");
            System.out.println(input);         


            //準備好回覆語句
            String reply= reply(input);
            //發送到客戶端
            socketOutput.println(reply);
            //發送到屏幕
            System.out.print("小瑤瑤:");
            System.out.println(reply);


            //客戶如果輸入的是再見則退出循環
            if(input.equals("再見")){
                break;
            }
        }  

        //關閉釋放資源
        socketInput.close();
        socketOutput.close();
        socket.close();
    }


    //回覆方法
    private static String reply(String input) {

        String output=replys[number%7];

        if(number%7==5){
            output = output+" "+input;
        }

        number++;
        return output;
    }

    //回覆方法用到的一些變量
    static int number =0;

    static String[] replys = new String[7];


    static{
        replys[0]= "你說的啥,我聽不見?";
        replys[1]= "聲音再大點行不?";
        replys[2]= "聲音再大點一點點行不?";
        replys[3]= "還是聽不清……";
        replys[4]= "看來是網絡的問題,你要不說慢點?";
        replys[5]= "聽到了!聽到了!你說的是:";
        replys[6]= "完了,又聽不清了……";
    }
}
        

 

客戶端代碼 TalkClient.java :

 

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

public class TalkClient {

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

        Socket socket = new Socket("127.0.0.1",8080);

        // 從socket中獲取一個輸入對象,以便接受從網絡上來的數據
        BufferedReader socketInput = new BufferedReader(newInputStreamReader(socket.getInputStream()));

        // 從標準輸入中獲取一個輸入對象,以便接受從鍵盤上傳來的數據
        BufferedReader keyboardInput = new BufferedReader(newInputStreamReader(System.in));

        // 從socket中獲取一個
        PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

        // 定義一些變量
        String input;      

        // 一直執行
        while(true){
            //從鍵盤獲取數據,通過socket對象發送出去
            input = keyboardInput.readLine();
            socketOutput.println(input);

            //接收從socket中獲取的服務器端發回的迴應信息,併發送到屏幕上
            input = socketInput.readLine();
            System.out.println(input);
        }
    }
}

 

編譯兩個文件,先運行TalkServer,開始接收客戶端的連接,然後運行客戶端,在客戶端上打字,服務器端會有迴應,運行截圖如下,這裏上一個服務器端的截圖:

image

 

好了,本將就到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章