在建立完ServerSocket对象后通过accept方法返回的Socket对象服务端就可以和客户端进行数据交互
Socket类和ServerSocket类都有两个得到输入输出流的方法getInputStream和getOutputStream对于Socket类而言使用getInputStream方法得到的InputStream是从服务端获取数据而getOutputStream方法得到的OutputStream是向服务端发送数据而ServerSocket的getInputStream和getOutputStream方法也类似InputStream从客户端读取数据OutputStream向客户端发送数据下面的代码是一个接收HTTP请求并返回HTTP请求头信息的程序它演示了ServerSocket类如何读取和发送来自客户端的数据
package server;
import *;
import javaio*;
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());
oswwrite(HTTP/ OK\r\n\r\n);
String s = ;
while (!(s = brreadLine())equals())
oswwrite(<html><body> + s + <br></body></html>);
oswflush();
socketclose();
}
catch (Exception e)
{
}
}
public HttpEchoServer(Socket socket)
{
thissocket = socket;
}
public static void main(String[] args) throws Exception
{
ServerSocket serverSocket = new ServerSocket();
Systemoutprintln(服务器已经启动端口);
while (true)
{
Socket socket = serverSocketaccept();
new HttpEchoServer(socket)start();
}
}
}
编译并运行HttpEchoServer后在IE的地址栏中输入URL输出结果如图所示
图
上面的代码并未验证HTTP请求类型因此GETPOSTHEAD等HTTP请求都可以得到回应在接收客户端请求后只向客户端输出了一行HTTP响应头信息(包括响应码和HTTP版本号)对于HTTP响应头来说这一行是必须有的其他的头字段都是可选的上面的代码每读一行请求头信息就向客户端写一行响应信息最后使用了flush方法将输出缓沖区中的内容发送的客户端这是必须的只要使用OutputStream在最后就必须要调用flush方法(在Socket类中使用OutputStream也是一样)