本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!
上一篇:Java網(wǎng)絡(luò)編程從入門到精通(25):創(chuàng)建ServerSocket對象
在建立完ServerSocket對象后,通過accept方法返回的Socket對象,服務(wù)端就可以和客戶端進(jìn)行數(shù)據(jù)交互。
Socket類和ServerSocket類都有兩個得到輸入輸出流的方法:getInputStream和getOutputStream。對于Socket類而言,使用getInputStream方法得到的InputStream是從服務(wù)端獲取數(shù)據(jù),而getOutputStream方法得到的OutputStream是向服務(wù)端發(fā)送數(shù)據(jù)。而ServerSocket的getInputStream和getOutputStream方法也類似。InputStream從客戶端讀取數(shù)據(jù),OutputStream向客戶端發(fā)送數(shù)據(jù)。下面的代碼是一個接收HTTP請求,并返回HTTP請求頭信息的程序,它演示了ServerSocket類如何讀取和發(fā)送來自客戶端的數(shù)據(jù)。
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("服務(wù)器已經(jīng)啟動,端口:8888");
while (true)
{
Socket socket = serverSocket.accept();
new HttpEchoServer(socket).start();
}
}
}
編譯并運(yùn)行HttpEchoServer后,在IE的地址欄中輸入URL:http://localhost:8888。輸出結(jié)果如圖1所示。
圖1
上面的代碼并未驗(yàn)證HTTP請求類型,因此,GET、POST、HEAD等HTTP請求都可以得到回應(yīng)。在接收客戶端請求后,只向客戶端輸出了一行HTTP響應(yīng)頭信息(包括響應(yīng)碼和HTTP版本號),對于HTTP響應(yīng)頭來說,這一行是必須有的,其他的頭字段都是可選的。上面的代碼每讀一行請求頭信息,就向客戶端寫一行響應(yīng)信息。最后使用了flush方法將輸出緩沖區(qū)中的內(nèi)容發(fā)送的客戶端。這是必須的,只要使用OutputStream,在最后就必須要調(diào)用flush方法(在Socket類中使用OutputStream也是一樣)。
下一篇:Java網(wǎng)絡(luò)編程從入門到精通(27):關(guān)閉服務(wù)端連接
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining