在建立完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();
}
}
}
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
也是一样)
。
本文转自 androidguy 51CTO博客,原文链接:
http://blog.51cto.com/androidguy/214407
,如需转载请自行联系原作者