Java服务器:套接字将HTML代码发送到浏览器

Java服务器:套接字将HTML代码发送到浏览器,java,html,sockets,browser,Java,Html,Sockets,Browser,我正在尝试使用ServerSockets编写一个简单的Java程序,它将向浏览器发送一些HTML代码。这是我的密码: ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(55555); } catch (IOException e) { System.err.println("Could not listen on port: 55555."); System.exit(1);

我正在尝试使用
ServerSockets
编写一个简单的Java程序,它将向浏览器发送一些HTML代码。这是我的密码:

ServerSocket serverSocket = null;
try {
    serverSocket = new ServerSocket(55555); 
} catch (IOException e) {
    System.err.println("Could not listen on port: 55555.");
    System.exit(1);
}

Socket clientSocket = null; 
try {
    clientSocket = serverSocket.accept();

    if(clientSocket != null) {           
        System.out.println("Connected");
    }
} catch (IOException e) {
    System.err.println("Accept failed.");
    System.exit(1);
}

PrintWriter out = new PrintWriter(clientSocket.getOutputStream());


out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/html");
out.println("\r\n");
out.println("<p> Hello world </p>");
out.flush();

out.close();

clientSocket.close();
serverSocket.close();
ServerSocket-ServerSocket=null;
试一试{
serverSocket=新的serverSocket(55555);
}捕获(IOE异常){
System.err.println(“无法侦听端口:55555”);
系统出口(1);
}
套接字clientSocket=null;
试一试{
clientSocket=serverSocket.accept();
如果(clientSocket!=null){
System.out.println(“已连接”);
}
}捕获(IOE异常){
System.err.println(“接受失败”);
系统出口(1);
}
PrintWriter out=新的PrintWriter(clientSocket.getOutputStream());
out.println(“HTTP/1.1200ok”);
println(“内容类型:text/html”);
out.println(“\r\n”);
out.println(“你好世界”

”; out.flush(); out.close(); clientSocket.close(); serverSocket.close();
然后在我的浏览器中转到
localhost:55555
,没有显示任何内容。我知道连接正在工作,因为程序输出if语句中选中的“Connected”。我还尝试过从inputStream输出数据,这很有效。但我试图在浏览器中输出的文本根本没有显示,程序运行完毕,我得到一个

“加载页面时出现问题-连接已重置”

在我的浏览器中,但没有文本

我在互联网上搜索过,似乎其他人都在用这种方式编码,他们的文本显示很好,他们还有其他问题。
我怎样才能解决这个问题

我在Chrome、Firefox、IE和Opera中测试了你的代码,它运行正常

但是,我建议您使用多线程,并从本质上产生一个新线程来处理每个新请求

您可以创建一个实现runnable并在构造函数中接受clientSocket的类。这将使您的自定义Web服务器能够同时接受多个请求

如果要处理多个请求,还需要一个while循环

这是一本很好的书,展示了上述内容:

如果web存档不起作用,我将发布下面的代码(取自上面):

/*
*myHTTPServer.java
*作者:S.Prasanna
*@version 1.00
*/
导入java.io.*;
导入java.net。*;
导入java.util.*;
公共类myHTTPServer扩展线程{
静态最终字符串HTML\u开始=
"" +
“java中的HTTP服务器”+
"";
静态最终字符串HTML\u结束=
"" +
"";
Socket connectedClient=null;
BufferedReader INFOROMCLIENT=null;
DataOutputStream outToClient=null;
公共myHTTPServer(套接字客户端){
connectedClient=客户端;
}
公开募捐{
试一试{
System.out.println(“客户机”+
connectedClient.getInetAddress()+“:“+connectedClient.getPort()+”已连接”);
INFOROMCLIENT=new BufferedReader(新的InputStreamReader(connectedClient.getInputStream());
outToClient=新的DataOutputStream(connectedClient.getOutputStream());
String requestString=inFromClient.readLine();
字符串标题行=请求字符串;
StringTokenizer标记器=新的StringTokenizer(标题线);
字符串httpMethod=tokenizer.nextToken();
字符串httpQueryString=tokenizer.nextToken();
StringBuffer responseBuffer=新的StringBuffer();
append(“这是HTTP服务器主页……
”; append(“HTTP客户端请求是……
”; System.out.println(“HTTP请求字符串为…”); while(informclient.ready()) { //阅读HTTP完整HTTP查询 追加(requestString+“
”); System.out.println(请求字符串); requestString=inFromClient.readLine(); } if(httpMethod.equals(“GET”)){ if(httpQueryString.equals(“/”){ //默认主页 sendResponse(200,responseBuffer.toString(),false); }否则{ //这被解释为一个文件名 字符串文件名=httpQueryString.replaceFirst(“/”,“”); fileName=urldecker.decode(文件名); if(新文件(fileName).isFile()){ sendResponse(200,文件名,true); } 否则{ sendResponse(404,“未找到请求的资源…”+ “用法:http://127.0.0.1:5000 或http://127.0.0.1:5000/“,假); } } } else sendResponse(404,“未找到请求的资源…”+ “用法:http://127.0.0.1:5000 或http://127.0.0.1:5000/“,假); }捕获(例外e){ e、 printStackTrace(); } } public void sendResponse(int statusCode、字符串responseString、boolean isFile)引发异常{ 字符串statusLine=null; String serverdetails=“Server:Java-HTTPServer”; 字符串contentLengthLine=null; 字符串文件名=null; String contentTypeLine=“内容类型:text/html”+“\r\n”; FileInputStream fin=null; 如果(状态代码==200) statusLine=“HTTP/1.1 200正常”+“\r\n”; 其他的 statusLine=“HTTP/1.1 404未找到”+“\r\n”; if(isFile){ fileName=responseString; fin=新文件输入流(文件名); contentLengthLine=“内容长度:”+Integer.toString(fin.available())+“\r\n”; 如果(!fileName.endsWith(“.htm”)和&!fileName.endsWith(“.html”)) contentTypeLine=“内容类型:\r\n”; } 否则{ responseString=myHTTPServer.HTML\u START+responseString+myHTTPServer.HTML\u END; contentLengthLine=“内容长度:”+responseString.Length()+“\r\n”; } outToClient.writeBytes(状态行); outToClient.writeBytes(服务器详细信息); outToClient.writeBytes(contentTypeLine); outToClient.writeBytes(contentLengthLine); outToClient.writeBytes(“连接:关闭\r\n”); outToClient.writeBytes(“\r\n”); if(isFile)sendFile(fin,outToClient); else outToClient.writeBytes(responseString); outToClient.close(); } public void sendFile(FileInputStream fin,DataOutputStream out)引发异常{ 字节[]缓冲区=新字节[1024]; int字节读取; 而((bytesRead=fin.read(buffer))!=-1){ out.write(缓冲区,0,字节读取); } fin.close(); } 公共静态void main(字符串args[])引发异常{ ServerSocket服务器=新的ServerSocket(5000,10,InetAddress.getByName(“127.0.0.1”); System.out.println(“TCPServer在端口5000上等待客户端”); W
/*
* myHTTPServer.java
* Author: S.Prasanna
* @version 1.00
*/

import java.io.*;
import java.net.*;
import java.util.*;

public class myHTTPServer extends Thread {

static final String HTML_START =
"<html>" +
"<title>HTTP Server in java</title>" +
"<body>";

static final String HTML_END =
"</body>" +
"</html>";

Socket connectedClient = null;
BufferedReader inFromClient = null;
DataOutputStream outToClient = null;


public myHTTPServer(Socket client) {
connectedClient = client;
}

public void run() {

try {

System.out.println( "The Client "+
  connectedClient.getInetAddress() + ":" + connectedClient.getPort() + " is connected");

  inFromClient = new BufferedReader(new InputStreamReader (connectedClient.getInputStream()));
  outToClient = new DataOutputStream(connectedClient.getOutputStream());

String requestString = inFromClient.readLine();
  String headerLine = requestString;

  StringTokenizer tokenizer = new StringTokenizer(headerLine);
String httpMethod = tokenizer.nextToken();
String httpQueryString = tokenizer.nextToken();

StringBuffer responseBuffer = new StringBuffer();
responseBuffer.append("<b> This is the HTTP Server Home Page.... </b><BR>");
  responseBuffer.append("The HTTP Client request is ....<BR>");

  System.out.println("The HTTP request string is ....");
  while (inFromClient.ready())
  {
    // Read the HTTP complete HTTP Query
    responseBuffer.append(requestString + "<BR>");
System.out.println(requestString);
requestString = inFromClient.readLine();
}

if (httpMethod.equals("GET")) {
if (httpQueryString.equals("/")) {
 // The default home page
sendResponse(200, responseBuffer.toString(), false);
} else {
//This is interpreted as a file name
String fileName = httpQueryString.replaceFirst("/", "");
fileName = URLDecoder.decode(fileName);
if (new File(fileName).isFile()){
sendResponse(200, fileName, true);
}
else {
sendResponse(404, "<b>The Requested resource not found ...." +
"Usage: http://127.0.0.1:5000 or http://127.0.0.1:5000/</b>", false);
}
}
}
else sendResponse(404, "<b>The Requested resource not found ...." +
"Usage: http://127.0.0.1:5000 or http://127.0.0.1:5000/</b>", false);
} catch (Exception e) {
e.printStackTrace();
}
}

public void sendResponse (int statusCode, String responseString, boolean isFile) throws Exception {

String statusLine = null;
String serverdetails = "Server: Java HTTPServer";
String contentLengthLine = null;
String fileName = null;
String contentTypeLine = "Content-Type: text/html" + "\r\n";
FileInputStream fin = null;

if (statusCode == 200)
statusLine = "HTTP/1.1 200 OK" + "\r\n";
else
statusLine = "HTTP/1.1 404 Not Found" + "\r\n";

if (isFile) {
fileName = responseString;
fin = new FileInputStream(fileName);
contentLengthLine = "Content-Length: " + Integer.toString(fin.available()) + "\r\n";
if (!fileName.endsWith(".htm") && !fileName.endsWith(".html"))
contentTypeLine = "Content-Type: \r\n";
}
else {
responseString = myHTTPServer.HTML_START + responseString + myHTTPServer.HTML_END;
contentLengthLine = "Content-Length: " + responseString.length() + "\r\n";
}

outToClient.writeBytes(statusLine);
outToClient.writeBytes(serverdetails);
outToClient.writeBytes(contentTypeLine);
outToClient.writeBytes(contentLengthLine);
outToClient.writeBytes("Connection: close\r\n");
outToClient.writeBytes("\r\n");

if (isFile) sendFile(fin, outToClient);
else outToClient.writeBytes(responseString);

outToClient.close();
}

public void sendFile (FileInputStream fin, DataOutputStream out) throws Exception {
byte[] buffer = new byte[1024] ;
int bytesRead;

while ((bytesRead = fin.read(buffer)) != -1 ) {
out.write(buffer, 0, bytesRead);
}
fin.close();
}

public static void main (String args[]) throws Exception {

ServerSocket Server = new ServerSocket (5000, 10, InetAddress.getByName("127.0.0.1"));
System.out.println ("TCPServer Waiting for client on port 5000");

while(true) {
Socket connected = Server.accept();
    (new myHTTPServer(connected)).start();
}
}
}
<html>
<head/>
<body>
<p> Hello world </p>
</body>
</html>
clientSocket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line = "";
while((line = bufferedReader.readLine()) != null){
    System.out.println(line);
    if(line.isEmpty())
        break;
}
Buffered reader in = new Buffered reader(new InputStreamReader(client_socket.getInputStream()));
public class Help {
    public static void main(String args) throws IOException{
        ServerSocket servsock new serverSocket(80)
        Socket cs servsock, accept();
        Printwriter out new Printwriter(Cs.getoutputstream), true)
        BufferedReader in new BufferedReader(new InputStreamReader(cs.getInputStream());
        out.println("<html> <body> <p>My first StackOverflow answer </p> </body> </html>");
        out.close();
        servsock.close();
    }
}