我正在尝试用Java创建一个简单的HTTP Web服务器。我只是采取婴儿步骤,所以它是超级简单的。我正在尝试这样做,以便我可以从客户端读取简单的输入,并在连接时从服务器输出任何内容。
在搜索了网站上的教程之后,这就是我到目前为止所做的:
public class Server
{
public static void main(String[] args) throws Exception
{
boolean listening = true;
ServerSocket server = null;
int port = 2222;
try
{
System.out.println("Server binding to port " + port);
server = new ServerSocket(port);
}
catch(Exception e)
{
System.out.println("Error: " + e);
System.exit(1);
}
System.out.println("Server successfully binded to port " + port);
while(listening)
{
System.out.println("Attempting to connect to client");
Socket client = server.accept();
System.out.println("Successfully connected to client");
new ServerThread(client).start() ;
}
server.close();
}
}
public class ServerThread extends Thread
{
private Socket socket = null ;
public ServerThread(Socket s)
{
this.socket = s ;
}
public void run()
{
InputStream in = socket.getInputStream() ;
OutputStream out = socket.getOutputStream() ;
byte [] message, reply;
while((in.read(message))
{
out.write(reply) ;
}
in.close() ;
out.close() ;
socket.close() ;
}
}
它绑定然后在尝试连接到客户端后挂起。这是因为我不确定你在ServerThread的while循环中做了什么,以及你对消息和回复变量做了什么> _<自从我完成Java以来已经很长时间了,所以放轻松吧!
答案 0 :(得分:1)
我只使用这种服务器作为“好奇心”,不再学习新东西,因为你正在重新发明轮子,安全原因等......我只需要使用它一次,因为我必须与服务器通信使用JSON代码,无法安装任何服务器。 这段代码需要更多的工作,比如我们为每个请求创建一个新线程,一个更好的RCF HTTP实现,但它适用于普通的浏览器。
我希望这会有所帮助。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MiniPbxManServer extends Thread {
private final int PORT = 2222;
public static void main(String[] args) {
MiniPbxManServer gtp = new MiniPbxManServer();
gtp.start();
}
public void run() {
try {
ServerSocket server = new ServerSocket(PORT);
System.out.println("MiniServer active "+PORT);
boolean shudown = true;
while (shudown) {
Socket socket = server.accept();
InputStream is = socket.getInputStream();
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line;
line = in.readLine();
String auxLine = line;
line = "";
// looks for post data
int postDataI = -1;
while ((line = in.readLine()) != null && (line.length() != 0)) {
System.out.println(line);
if (line.indexOf("Content-Length:") > -1) {
postDataI = new Integer(line
.substring(
line.indexOf("Content-Length:") + 16,
line.length())).intValue();
}
}
String postData = "";
for (int i = 0; i < postDataI; i++) {
int intParser = in.read();
postData += (char) intParser;
}
out.println("HTTP/1.0 200 OK");
out.println("Content-Type: text/html; charset=utf-8");
out.println("Server: MINISERVER");
// this blank line signals the end of the headers
out.println("");
// Send the HTML page
out.println("<H1>Welcome to the Mini PbxMan server</H1>");
out.println("<H2>GET->"+auxLine+ "</H2>");
out.println("<H2>Post->"+postData+ "</H2>");
out.println("<form name=\"input\" action=\"imback\" method=\"post\">");
out.println("Username: <input type=\"text\" name=\"user\"><input type=\"submit\" value=\"Submit\"></form>");
//if your get parameter contains shutdown it will shutdown
if(auxLine.indexOf("?shutdown")>-1){
shudown = false;
}
out.close();
socket.close();
}
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
url:localhost:2222 /无论
答案 1 :(得分:0)
我认为你在正确的方向上走得很远。你所拥有的和生产系统之间的区别在于,他们对套接字上的输入进行轮询是在不同的线程中完成的,以免在等待输入时停止系统。
实际上,Web服务器的配置参数之一是要启动并运行的客户端(线程)数量。
答案 2 :(得分:0)
您应该始终从服务器的输出流中刷新数据。客户响应可能取决于:
out.flush();
要检查流的结尾,您可以使用:
int result = 0;
while ((result = in.read(message)) != -1) {
...
此外,您的回复消息似乎未初始化,您可能最初要重新发送客户端数据:
reply = message;
答案 3 :(得分:0)
jdk有一个简单的http服务器,用于构建嵌入式http服务器。看一下这个link。