📄 threadedserver.java
字号:
/*
* Created on 2008-3-20
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* SSD8 EX 1
* @author Fantao
* ThreadedServer.java
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class ThreadedServer {
/*
* Waiting for requests from more than two clients.
*/
public ThreadedServer() throws Exception {
/* server socket */
ServerSocket serverskt = new ServerSocket(8000);
/* number of clients */
int number = 1;
while (true) {
Socket clientskt = serverskt.accept();
System.out.println("Accepting Client " + number + "'s Connection...\n");
/* a thread for a client */
ServerThread st = new ServerThread(clientskt, number++);
st.start();
}
}
class ServerThread extends Thread {
/* client socket */
private Socket skt;
/* number of clients */
private int number;
ServerThread(Socket skt, int counter) {
this.skt = skt;
this.number = counter;
}
public void run() {
/* reader and writer with client and file */
FileInputStream inFromFile = null;
BufferedReader inFromClient = null;
DataOutputStream outToClient = null;
/* response the request */
try {
while (true) {
inFromClient = new BufferedReader(new InputStreamReader(skt
.getInputStream()));
outToClient = new DataOutputStream(skt.getOutputStream());
System.out.println("Waiting for Client #" + number
+ "\'s command...");
String cmd = inFromClient.readLine();
System.out.println("The Client #" + number + " request for: "
+ cmd);
/*
* If command error, write the error response and break.
*
*/
StringTokenizer token = new StringTokenizer(cmd);
if (token.countTokens() < 2) {
System.out.println("Command style error!");
outToClient.writeBytes("HTTP/1.1 400 Bad Request\n\r");
break;
} else {
String method = token.nextToken();
String filename = token.nextToken();
if (!method.equals("GET")) {
System.out.println("HTTP/1.1 400 Bad Request\n\r");
break;
}
if (filename.charAt(0) != '/') {
System.out.println("Filename command error!");
outToClient
.writeBytes("HTTP/1.1 400 Bad Request\n\r");
break;
}
filename = filename.toUpperCase();
filename = (filename.equals("/") ? "INDEX.HTM"
: filename.substring(1));
File file = new File(filename);
if (!file.exists()) {
System.out.println("File not existed!");
outToClient
.writeBytes("HTTP/1.1 404 Not Found\n\r");
break;
}
/*
* Response the right format request.
* write it to the client.
*/
System.out.println("Now respond the Client #" + number
+ "\'s request...");
inFromFile = new FileInputStream(filename);
byte[] by = new byte[(int) file.length()];
inFromFile.read(by);
if (filename.endsWith(".HTM")) {
outToClient.writeBytes("HTTP/1.0 200 OK" + "\n\r");
outToClient.writeBytes("Content-Type: txt/html"
+ "\n\r");
outToClient.writeBytes("Content-Length: "
+ file.length() + "\n\r\n\r");
}
outToClient.write(by);
outToClient.flush();
outToClient.writeBytes("\n\r");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
/*
* Close all the reader, writer and client socket.
*/
System.out.println("Closing Client #" + number
+ "\'s Connection...\n");
try {
if (inFromFile != null)
inFromFile.close();
if (inFromClient != null)
inFromClient.close();
if (outToClient != null)
outToClient.close();
if (skt != null)
skt.close();
} catch (IOException e) {
}
}
}
}
/*
* Open a threaded server socket and request the responses from clients.
*/
public static void main(String[] args) {
try {
ThreadedServer threadedServer = new ThreadedServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -