天天看點

Java網絡程式設計從入門到精通(26):在服務端接收和發送資料

本文為原創,如需轉載,請注明作者和出處,謝謝!

在建立完ServerSocket對象後,通過accept方法傳回的Socket對象,服務端就可以和用戶端進行資料互動。

Socket類和ServerSocket類都有兩個得到輸入輸出流的方法:getInputStream和getOutputStream。對于Socket類而言,使用getInputStream方法得到的InputStream是從服務端擷取資料,而getOutputStream方法得到的OutputStream是向服務端發送資料。而ServerSocket的getInputStream和getOutputStream方法也類似。InputStream從用戶端讀取資料,OutputStream向用戶端發送資料。下面的代碼是一個接收HTTP請求,并傳回HTTP請求頭資訊的程式,它示範了ServerSocket類如何讀取和發送來自用戶端的資料。

package server;

import java.net.*;

import java.io.*;

public class HttpEchoServer extends Thread

{

    private Socket socket;

    public void run()

    {

        try

        {

            InputStreamReader isr = new InputStreamReader(socket

                            .getInputStream());

            BufferedReader br = new BufferedReader(isr);

            OutputStreamWriter osw = new OutputStreamWriter(socket

                            .getOutputStream());

            osw.write("HTTP/1.1 200 OK/r/n/r/n");

            String s = "";

            while (!(s = br.readLine()).equals(""))

                osw.write("<html><body>" + s + "<br></body></html>");

            osw.flush();

            socket.close();

        }

        catch (Exception e)

    }

    public HttpEchoServer(Socket socket)

        this.socket = socket;

    public static void main(String[] args) throws Exception

        ServerSocket serverSocket = new ServerSocket(8888);

        System.out.println("伺服器已經啟動,端口:8888");

        while (true)

            Socket socket = serverSocket.accept();

            new HttpEchoServer(socket).start();

}

編譯并運作HttpEchoServer後,在IE的位址欄中輸入URL:http://localhost:8888。輸出結果如圖1所示。

圖1

    上面的代碼并未驗證HTTP請求類型,是以,GET、POST、HEAD等HTTP請求都可以得到回應。在接收用戶端請求後,隻向用戶端輸出了一行HTTP響應頭資訊(包括響應碼和HTTP版本号),對于HTTP響應頭來說,這一行是必須有的,其他的頭字段都是可選的。上面的代碼每讀一行請求頭資訊,就向用戶端寫一行響應資訊。最後使用了flush方法将輸出緩沖區中的内容發送的用戶端。這是必須的,隻要使用OutputStream,在最後就必須要調用flush方法(在Socket類中使用OutputStream也是一樣)。

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>

繼續閱讀