- package test.io;
- import java.net.*;
- import java.io.*;
- /**
- * 一个简单的Socket实现的HTTP响应服务器。<br>
- * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。
- *
- * @author 赵学庆 www.java2000.net
- */
- public class MyWebServer {
- public static void main(String[] args) {
- Socket socket = null;
- try {
- // 创建一个监听8000端口的服务器Socket
- ServerSocket s = new ServerSocket(8000, 3);
- System.out.println("MyWebServer等待来自浏览器的连接\n");
- while (true) {
- socket = s.accept();
- System.out.println("连接已建立。端口号:" + socket.getPort());
- new MyWebServerThread(socket).start();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- class MyWebServerThread extends Thread {
- private Socket socket;
- MyWebServerThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- try {
- InputStreamReader is = new InputStreamReader(socket.getInputStream());
- char[] bs = new char[2048];
- PrintStream out;
- out = new PrintStream(socket.getOutputStream());
- StringBuilder msg = new StringBuilder();
- // 如果10毫秒还没有数据,则视同没有新的数据了。
- // 因为有Keep-Alive的缘故,浏览器可能不主动断开连接的。
- // 实际应用,会根据协议第一行是GET还是 POST确定。
- socket.setSoTimeout(10);
- //
- // 此处读入请求数据并做相应的处理
- //
- int len = -1;
- try {
- while ((len = is.read(bs)) != -1) {
- msg.append(bs, 0, len);
- msg.append("\n");
- }
- } catch (Exception ex) {
- // ex.printStackTrace();
- }
- // 下面是由服务器直接生成的主页内容
- // 1、首先向浏览器输出响应头信息
- out.println("HTTP/1.1 200 OK");
- out.println("Content-Type:text/html;charset:GBK");
- out.println();
- // 2、输出主页信息
- out
- .println("<HTML><BODY>"
- + "<center>"
- + "<H1>HTTP协议测试服务器,当前时间:"
- + new java.util.Date()
- + "</h1>"
- + "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET测试'/></form><br/>"
- + "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST测试'/></form><br/>"
- + "<form method='post' enctype='multipart/form-data'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload测试'/></form>"
- + "</center>您提交的数据如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");
- out.flush();
- out.close();
- is.close();
- System.out.println("close");
- // 关闭连接
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
package test.io;
import java.net.*;
import java.io.*;
/**
* 一个简单的Socket实现的HTTP响应服务器。<br>
* 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。
*
* @author */
public class MyWebServer {
public static void main(String[] args) {
Socket socket = null;
try {
// 创建一个监听8000端口的服务器Socket
ServerSocket s = new ServerSocket(8000, 3);
System.out.println("MyWebServer等待来自浏览器的连接\n");
while (true) {
socket = s.accept();
System.out.println("连接已建立。端口号:" + socket.getPort());
new MyWebServerThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MyWebServerThread extends Thread {
private Socket socket;
MyWebServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStreamReader is = new InputStreamReader(socket.getInputStream());
char[] bs = new char[2048];
PrintStream out;
out = new PrintStream(socket.getOutputStream());
StringBuilder msg = new StringBuilder();
// 如果10毫秒还没有数据,则视同没有新的数据了。
// 因为有Keep-Alive的缘故,浏览器可能不主动断开连接的。
// 实际应用,会根据协议第一行是GET还是 POST确定。
socket.setSoTimeout(10);
//
// 此处读入请求数据并做相应的处理
//
int len = -1;
try {
while ((len = is.read(bs)) != -1) {
msg.append(bs, 0, len);
msg.append("\n");
}
} catch (Exception ex) {
// ex.printStackTrace();
}
// 下面是由服务器直接生成的主页内容
// 1、首先向浏览器输出响应头信息
out.println("HTTP/1.1 200 OK");
out.println("Content-Type:text/html;charset:GBK");
out.println();
// 2、输出主页信息
out
.println("<HTML><BODY>"
+ "<center>"
+ "<H1>HTTP协议测试服务器,当前时间:"
+ new java.util.Date()
+ "</h1>"
+ "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET测试'/></form><br/>"
+ "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST测试'/></form><br/>"
+ "<form method='post' enctype='multipart/form-data'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload测试'/></form>"
+ "</center>您提交的数据如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");
out.flush();
out.close();
is.close();
System.out.println("close");
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果
GET方法
引用:
GET /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=1&password=2
POST方法
引用:
POST /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=111&password=222
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
username=111&password=222
UPLOAD
引用:
POST /?username=111&password=222 HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8000/?username=111&password=222
Content-Type: multipart/form-data; boundary=---------------------------23757983230932
Content-Length: 1704
-----------------------------23757983230932
Content-Disposition: form-data; name="phototitle"
12
-----------------------------23757983230932
Content-Disposition: form-data; name="photo"; filename="技术考核题.txt"
Content-Type: text/plain
技术考核
本次是个编程题,题目选Java/语言进行回答。
问题描述:
假设你的爱好是集邮。目前总共有N种不同的邮票,编号为从0到N-1.每种邮票的价钱被定义在数组int[] prices中(序号从0开始,数组的第i个元素表示第i种邮票的价格)。
你的目标是收集尽可能多种的邮票。你当前拥有的邮票存储在int[] have这个数组中。初始时,你没有钱,但是你可以卖掉已有邮票来买不同的邮票。返回你能收集到的不同种邮票的最大数量。
定义:
class: PostmarksCollection
method: numberOfDistinctPostmarks
Parameters: int[], int[]
Returns: int
Method signature: public int numberOfDistinctPostmarks(int[] prices, int[] have)
//为了进行测试,必须保证是public
约束:
1) N从1到50
2)prices中的元素数量刚好是N个元素
3)prices中的元素的值,从1到1,000,000
4)have中的元素数量是0个到N个
5)have中的每个元素是不同的
6)have中的每个元素的值是从0到N-1.
例如:
1)
{13,10,14,20}
{3,0,2,1}
Returns: 4
你已经拥有所有种类的邮票。
2)
{7,5,9,7}
{}
Returns: 0
你开始没有任何邮票,所以你也不能组任何事情。
3)
{4,13,9,1,5}
{1,3,2}
Returns: 4
卖掉邮票2,买入邮票0和4,(邮票2的价钱是9,邮票0的价钱是4,邮票4的价钱是5,卖掉2刚好买入0和4)
4)
{16,32,13,2,17,10,8,8,20,17}
{7,0,4,1,6,8}
Returns: 8
--------------------------------------------------------------------------------
使用Java请在此处答题(请使用JDK5.0编译,编译不能通过者不计算分数)
-----------------------------23757983230932--
本文介绍了一个简单的Socket实现的HTTP响应服务器,用于演示HTTP协议的基本交互过程。服务器监听8000端口,支持GET和POST请求,并能显示浏览器发送的数据。
640

被折叠的 条评论
为什么被折叠?



