用socket写的http服务器只能从客户端读取一次数据,后面就不能读取了,但是服务器和客户端之间还是有tcp连接,并且可以向客户端返回数据
服务器端的代码:
public class Server {
private static final Integer port=7777;
public static void main(String[] args) {
ServerSocket Serversocket;
try {
System.out.println("Server start...");
Serversocket=new ServerSocket(port);//创建Socket,监听客户端请求
//服务器一直处于监听状态
while (true){
Socket socket=Serversocket.accept();//服务器一直处于监听状态,并且在此处等待,当有客户端的消息到达时,才继续向下执行
System.out.println("build a new tcp link with the client,the addressis: "+socket.getInetAddress()+":"+socket.getPort());
//并发处理客户端HTTP请求
service(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void service(Socket socket){
new Thread(new Runnable() {
@Override
public void run() {
InputStream inSocket;
try {
inSocket=socket.getInputStream();//获取HTTP请求头
int size=inSocket.available();
byte[] buffer=new byte[size];
inSocket.read(buffer);
String request=new String(buffer);
//System.out.println("----------------------------------------------------------\nClientBrowser:\n"+request+"\n----------------------------------------------------------------");
String contentType="application/json";
if(request.length()>0){
System.out.println(request);
}
//将响应发送给客户端
//System.out.println(flag);
String responseFirstLine="HTTP/1.1 200 OK\r\n";
String responseHead="Content-Type:"+contentType+"\r\n";
OutputStream outSocket=socket.getOutputStream();
//System.out.println("----------------------------------------------------------\nServerResponse:\n"+request+"\n----------------------------------------------------------------");
outSocket.write(responseFirstLine.getBytes());
outSocket.write(responseHead.getBytes());
outSocket.write("\r\n".getBytes());
//响应报文头部结束,接下来写入内容
outSocket.write("{\"name\":\"gyy\",".getBytes());
outSocket.write("\"words:\":\"i love you\"}".getBytes());
outSocket.flush();
//inSocket.close();
outSocket.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}