⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpserver.java

📁 java nio 编程一个实例子.服务端程序
💻 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 + -