📄 httpserver.java
字号:
package com.ronsoft.books.nio.channels;import java.nio.ByteBuffer;import java.nio.MappedByteBuffer;import java.nio.CharBuffer;import java.nio.channels.FileChannel;import java.nio.channels.FileChannel.MapMode;import java.nio.channels.Channels;import java.nio.channels.GatheringByteChannel;import java.nio.channels.SocketChannel;import java.nio.channels.ServerSocketChannel;import java.nio.charset.Charset;import java.util.regex.Pattern;import java.util.regex.Matcher;import java.net.InetSocketAddress;import java.net.URLConnection;import java.io.FileInputStream;import java.io.FileOutputStream;/** * Simple-minded HTTP server using MappedByteBuffers. * This example will be expanded significantly * * Created: April 2002 * @author Ron Hitchens (ron@ronsoft.com) * @version $Id: HttpServer.java,v 1.2 2002/05/16 01:45:48 ron Exp $ */public class HttpServer{ private static final int DEFAULT_PORT = 8880; private static final String DEFAULT_ROOT_DIR = "."; private static final String LINE_SEP = "\r\n"; private static final String HTTP_HDR = "HTTP/1.0 200 OK" + LINE_SEP + "Server: Ronsoft Sample Server" + LINE_SEP + "Content-Type: text/plain" + LINE_SEP; private ByteBuffer staticHdr = ByteBuffer.wrap (HTTP_HDR.getBytes()); private Charset utf8 = Charset.forName ("UTF-8"); private Pattern space = Pattern.compile ("\\s+"); //private Matcher spaceMatch = space.matcher (""); private String rootDir = DEFAULT_ROOT_DIR; // --------------------------------------------------------- public static void main (String [] argv) throws Exception { int port = DEFAULT_PORT; if (argv.length != 0) { port = Integer.parseInt (argv [0]); } HttpServer server = new HttpServer(); System.out.println ("Starting server on port " + port); server.runServer (port); } public void runServer (int port) throws Exception { ServerSocketChannel ssc = ServerSocketChannel.open(); ByteBuffer temp = ByteBuffer.allocate (1024 * 10); ssc.socket().bind (new InetSocketAddress (port)); while (true) { SocketChannel socket = ssc.accept(); temp.clear(); socket.read (temp); temp.flip(); CharBuffer cb = utf8.decode (temp);System.out.println ("cb = " + cb); String [] tokens = space.split (cb, 3); String filename = rootDir + tokens [1]; FileInputStream fis = new FileInputStream (filename); FileChannel fc = fis.getChannel(); sendFile (fc, socket, URLConnection.guessContentTypeFromName (filename)); fc.close(); fis.close(); socket.close(); } } public void sendFile (FileChannel file, GatheringByteChannel out, String contentType) throws Exception { MappedByteBuffer fileData = file.map (MapMode.READ_ONLY, 0, file.size()); sendBuffer (fileData, out, contentType); } private CharBuffer cbtemp = CharBuffer.allocate (1024); private ByteBuffer dynHdr = ByteBuffer.allocate (1024); private void sendBuffer (ByteBuffer data, GatheringByteChannel channel, String contentType) throws Exception { ByteBuffer [] buffers = { staticHdr, dynHdr, data }; staticHdr.rewind(); cbtemp.clear(); cbtemp.put ("Content-Length: " + data.limit()); cbtemp.put (LINE_SEP); cbtemp.put ("Content-Type: "); cbtemp.put (contentType); cbtemp.put (LINE_SEP); cbtemp.put (LINE_SEP); cbtemp.flip(); buffers [1] = utf8.encode (cbtemp); while (channel.write (buffers) != 0) { // nothing } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -