我一直在尝试编写一个简单的Web服务器的开头,但似乎无法获得发送的响应。我已经尝试了可以想象的每种类型的输出流,但似乎没有任何效果。我不知所措。以下是我正在使用的两个类,对于一些无关的代码感到抱歉:
package edu.xsi.webserver;
import java.io.IOException;
import java.net.ServerSocket;
public class WebServer {
int port;
ServerSocket server;
public WebServer(int port) throws IOException{
this.port = port;
this.server = new ServerSocket(port);
Thread t = new Thread(new ServerExec());
t.start();
}
public class ServerExec implements Runnable {
public void run(){
int i = 0;
while (true) {
try {
new WebSession(server.accept(), i++);
System.out.println("Should print before session");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
try {
WebServer webServer = new WebServer(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是处理响应的会话类。
package edu.xsi.webserver;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class WebSession implements Runnable {
Socket client;
int num;
public WebSession(Socket client, int num) {
this.num = num;
this.client = client;
Thread t = new Thread(this);
t.start();
}
public void run() {
Scanner s = null;
DataOutputStream out = null;
try {
s = new Scanner(client.getInputStream());
out = new DataOutputStream(client.getOutputStream());
//Get all input from header
while (s.hasNextLine()) {
System.out.println(s.nextLine());
}
out.writeBytes("HTTP/1.1 200 OK\r\n");
out.writeBytes("Content-Type: text/html\r\n\r\n");
out.writeBytes("<html><head></head><body><h1>Hello</h1></body></html>");
s.close();
out.flush();
out.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
答案 0 :(得分:11)
在一个非常相似的问题上,我一直在疯狂地挣扎。
在墙上贴着标题后我发现我的问题是如此微不足道,我一直在墙上敲打一会儿。
基本上在我的输入while循环中我检查空行,但是我忘了检查空行(并随后中断)。
不保证它对你来说都是一样的,但这是我的一分钱:
in = session.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
// this seems to be the key for me!
// somehow I never get out of this loop if I don't
// check for an empty line...
if (line.isEmpty()) {
break;
}
}
out = new BufferedWriter(
new OutputStreamWriter(
new BufferedOutputStream(session.getOutputStream()), "UTF-8")
);
out.write(OUTPUT_HEADERS + OUTPUT.length() + OUTPUT_END_OF_HEADERS + OUTPUT);
out.flush();
out.close();
session.close();
我的常数是:
private static final String OUTPUT = "<html><head><title>Example</title></head><body><p>Worked!!!</p></body></html>";
private static final String OUTPUT_HEADERS = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: ";
private static final String OUTPUT_END_OF_HEADERS = "\r\n\r\n";
我的“会话”变量是Socket
个对象。
答案 1 :(得分:1)
关闭扫描程序会关闭基础输入流,从而关闭套接字。不要关闭它。关闭输出流也会关闭套接字。您不需要两者,并且应该关闭输出流/写入器而不是输入流,以便刷新它。
答案 2 :(得分:1)
以下代码将解决您的问题:
package com.cs.sajal;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TestCls {
public static void main(String[] args) {
boolean flag = false;
try {
ServerSocket ss = new ServerSocket(8080);
if (ss.isBound()) {
while (flag = true) {
final Socket s = ss.accept();
Thread t1=new Thread(new Runnable (){String line = null;public void run(){try{ InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}});
Thread t2=new Thread(new Runnable (){String line = null;public void run(){try{ OutputStream os = s.getOutputStream();
Scanner sc=new Scanner(System.in);
String inp=null;
String t="HTTP/1.1 200 OK\r\n";
byte[]s=t.getBytes("UTF-8");
os.write(s);
t="Content-Length: 788\r\n";
s=t.getBytes("UTF-8");
os.write(s);
t="Content-Type: text/html\r\n\r\n";
s=t.getBytes("UTF-8");
os.write(s);
t="\r\n\r\n<html><body><h1>this is output</h1><table cellpading=5 border=5><tr><td>name</td><td>age></td><td>height</td></tr></table></body></html>\r\n\r\n";
s=t.getBytes("UTF-8");
os.write(s);
t="Connection: Closed";
s=t.getBytes("UTF-8");
os.write(s);
os.flush();
}
catch(Exception e)
{
e.printStackTrace();
}
}});
t1.start();
t2.start();t1.join();
t2.join();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 3 :(得分:1)
尝试通过日期。
String res = "HTTP/1.0 200 OK\n"
+ "Server: HTTP server/0.1\n";
+ "Date: "+format.format(new java.util.Date())+"\n";
+ "Content-type: text/html; charset=UTF-8\n";
+ "Content-Length: 38\n\n";
+ "<html><body>OK</body></html>";
out.write(res.getBytes());
out.flush();
private SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:Ss z");