【发布时间】:2014-05-17 05:43:16
【问题描述】:
我正在编写网络服务器:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class HttpServer {
public static void main(String[] args) throws Throwable {
//http://localhost:3000
ServerSocket ss = new ServerSocket(3000);
while (true) {
//Waiting for socket
Socket s = ss.accept();
System.out.println("Client accepted");
//The main process
new SocketProcessor(s, ss).start();
}
}
private static class SocketProcessor implements Runnable {
private Thread t;
private Socket s;
private InputStream is;
private OutputStream os;
private SocketProcessor(Socket s, ServerSocket ss) throws Throwable {
t = new Thread(this, "Server Thread");
this.s = s;
this.is = s.getInputStream();
this.os = s.getOutputStream();
}
public void run() {
try {
readInputHeaders();
writeResponse("<html><body><h1>Hello</h1></body></html>");
} catch (Throwable t) {
/*do nothing*/
} finally {
try {
s.close();
} catch (Throwable t) {
}
}
System.out.println("Client processing finished");
}
public void start() {
t.start();
}
private void writeResponse(String s) throws Throwable {
String response = "HTTP/1.1 200 OK\r\n" +
"Server: Server\r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: " + s.length() + "\r\n" +
"Connection: close\r\n\r\n";
String result = response + s;
os.write(result.getBytes());
os.flush();
}
private void readInputHeaders() throws Throwable {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (true) {
int a = br.read();
System.out.print((char)a);
if (a==-1) {
break;
}
}
}
}
}
但是我在阅读方面遇到了麻烦。这个方法太费时间了:
private void readInputHeaders() throws Throwable {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while (true) {
int a = br.read();
System.out.print((char)a);
if (a==-1) {
break;
}
}
}
它返回标题和查询字符串,但它冻结了我的网络服务器。怎么了?
【问题讨论】:
-
作为一个单独的线程运行它。不在主线程中。当你收到请求时。产生一个新线程来响应请求。
-
我认为你应该更具体一点:输出是什么,你期望什么?它是否恰好在您期望 -1 时立即挂在 br.read() 上?你用的是什么客户端?
标签: java sockets http inputstream