当前位置: 首页 > news >正文

网站建设开发全包女人被做网站

网站建设开发全包,女人被做网站,网站建设厂商,网站管理公司 优帮云在前面我们尝试解释Tomcat的理论#xff0c;但是呢#xff0c;很多时候那些复杂的架构和设计会让我们眼花缭乱#xff0c;以至于忽略了最进本的问题——服务器到底是什么#xff1f;今天我们就用尽量简单的代码实现一个简易的HTTP服务器。 HTTP启动之后要持续监听#xf…在前面我们尝试解释Tomcat的理论但是呢很多时候那些复杂的架构和设计会让我们眼花缭乱以至于忽略了最进本的问题——服务器到底是什么今天我们就用尽量简单的代码实现一个简易的HTTP服务器。 HTTP启动之后要持续监听所以我们可以使用NioServer中的Handler就可以了在修改后的HttpHandler中首先获取到请求报文并打印出报文的头部包括协议的首行、请求方法的类型、Url和Http版本等之后将接收到的请求消息(也就是报文信息)封装在一起最后将这些信息打包成一个报文发送给客户端。 我们这里为了简单将HttpHandler使用单线程来处理并且选择SelectionKey的操作类型等都放在Handler中了。 主体代码 public static void main(String[] args) throws Exception{//创建ServerSocketChannel监听8040端口ServerSocketChannel sscServerSocketChannel.open();ssc.socket().bind(new InetSocketAddress(8040));//设置为非阻塞模式ssc.configureBlocking(false);//为ssc注册选择器Selector selectorSelector.open();ssc.register(selector, SelectionKey.OP_ACCEPT);//创建处理器while(true){// 等待请求每次等待阻塞5s超过5s后线程继续向下运行// 这里如果传入0或者不传参数将一直阻塞if(selector.select(5000)0){continue;}// 获取待处理的SelectionKeyIteratorSelectionKey keyIterselector.selectedKeys().iterator();while(keyIter.hasNext()){SelectionKey keykeyIter.next();// 启动新线程处理SelectionKeynew Thread(new HttpHandler(key)).run();// 处理完后从待处理的SelectionKey迭代器中移除当前所使用的keykeyIter.remove();}}} 我们在上面将端口设置为8040了因为8080有时候会和其他软件冲突有时候会被浏览器隐藏所以我们使用一个更可控的。 之后我们就来写真正需要干活的Hander private static class HttpHandler implements Runnable{private int bufferSize 2048;private String localCharset UTF-8;private SelectionKey key;public HttpHandler(SelectionKey key){this.key key;}Overridepublic void run() {try{// 接收到连接请求时if(key.isAcceptable()){handleAccept();}// 读数据if(key.isReadable()){handleRead();}} catch(IOException ex) {ex.printStackTrace();}} } 我们使用一个线程来处理清楚所以我们需要继续实现run()方法,根据选择器的状态来完成接收数据还是读取数据。 先看接收数据 public void handleAccept() throws IOException {SocketChannel clientChannel((ServerSocketChannel)key.channel()).accept();clientChannel.configureBlocking(false);clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));} 这段代码看似简单其实包含的逻辑并不少我们可以看到这里是从key获得Socket通信使用了哪个通道(对于HTTP的就是不同端口号)这个key是哪里的呢是我们再创建HttpHandler的时候传过来的也就是这一行 new Thread(new HttpHandler(key)).run(); 这相当于老板让你干活的时候给你的锤子。 之后的这一行就是自己创建了一个channel注册给key。 clientChannel.register(key.selector()...) 这里相当于打仗之前你去军长那里报道说你能打然后军长Key就记住你了。 之后我们看读取数据的处理逻辑 public void handleRead() throws IOException {// 获取channelSocketChannel sc(SocketChannel)key.channel();// 获取buffer并重置ByteBuffer buffer(ByteBuffer)key.attachment();buffer.clear();// 没有读到内容则关闭if(sc.read(buffer)-1){sc.close();} else {// 接收请求数据buffer.flip();String receivedString Charset.forName(localCharset).newDecoder().decode(buffer).toString();// 控制台打印请求报文头String[] requestMessage receivedString.split(\r\n);for(String s: requestMessage){System.out.println(s);// 遇到空行说明报文头已经打印完if(s.isEmpty())break;}// 控制台打印首行信息String[] firstLine requestMessage[0].split( );System.out.println();System.out.println(Method:\tfirstLine[0]);System.out.println(url:\tfirstLine[1]);System.out.println(HTTP Version:\tfirstLine[2]);System.out.println();// 返回客户端StringBuilder sendString new StringBuilder();sendString.append(HTTP/1.1 200 OK\r\n);//响应报文首行200表示处理成功sendString.append(Content-Type:text/html;charset localCharset\r\n);sendString.append(\r\n);// 报文头结束后加一个空行sendString.append(htmlheadtitle显示报文/title/headbody);sendString.append(接收到请求报文是br/);for(String s: requestMessage){sendString.append(s br/);}sendString.append(/body/html);buffer ByteBuffer.wrap(sendString.toString().getBytes(localCharset));sc.write(buffer);sc.close();}} 这里我们可以看到执行读的时候我们使用key里获得channel的。这就相当于司令要求你所在的连队突袭然后你的军长key就从自己的小本本上找到你然后让你们行动。我们看一下执行效果 在浏览器输入http://localhost:8040/ 然后在控制台我们看到http收到的相应如下 最后附上完整代码 public class HttpServer {public static void main(String[] args) throws Exception{//创建ServerSocketChannel监听8040端口ServerSocketChannel sscServerSocketChannel.open();ssc.socket().bind(new InetSocketAddress(8040));//设置为非阻塞模式ssc.configureBlocking(false);//为ssc注册选择器Selector selectorSelector.open();ssc.register(selector, SelectionKey.OP_ACCEPT);//创建处理器while(true){// 等待请求每次等待阻塞5s超过5s后线程继续向下运行// 这里如果传入0或者不传参数将一直阻塞if(selector.select(5000)0){continue;}// 获取待处理的SelectionKeyIteratorSelectionKey keyIterselector.selectedKeys().iterator();while(keyIter.hasNext()){SelectionKey keykeyIter.next();// 启动新线程处理SelectionKeynew Thread(new HttpHandler(key)).run();// 处理完后从待处理的SelectionKey迭代器中移除当前所使用的keykeyIter.remove();}}}private static class HttpHandler implements Runnable{private int bufferSize 2048;private String localCharset UTF-8;private SelectionKey key;public HttpHandler(SelectionKey key){this.key key;}public void handleAccept() throws IOException {SocketChannel clientChannel((ServerSocketChannel)key.channel()).accept();clientChannel.configureBlocking(false);clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));}public void handleRead() throws IOException {// 获取channelSocketChannel sc(SocketChannel)key.channel();// 获取buffer并重置ByteBuffer buffer(ByteBuffer)key.attachment();buffer.clear();// 没有读到内容则关闭if(sc.read(buffer)-1){sc.close();} else {// 接收请求数据buffer.flip();String receivedString Charset.forName(localCharset).newDecoder().decode(buffer).toString();// 控制台打印请求报文头String[] requestMessage receivedString.split(\r\n);for(String s: requestMessage){System.out.println(s);// 遇到空行说明报文头已经打印完if(s.isEmpty())break;}// 控制台打印首行信息String[] firstLine requestMessage[0].split( );System.out.println();System.out.println(Method:\tfirstLine[0]);System.out.println(url:\tfirstLine[1]);System.out.println(HTTP Version:\tfirstLine[2]);System.out.println();// 返回客户端StringBuilder sendString new StringBuilder();sendString.append(HTTP/1.1 200 OK\r\n);//响应报文首行200表示处理成功sendString.append(Content-Type:text/html;charset localCharset\r\n);sendString.append(\r\n);// 报文头结束后加一个空行sendString.append(htmlheadtitle显示报文/title/headbody);sendString.append(接收到请求报文是br/);for(String s: requestMessage){sendString.append(s br/);}sendString.append(/body/html);buffer ByteBuffer.wrap(sendString.toString().getBytes(localCharset));sc.write(buffer);sc.close();}}Overridepublic void run() {try{// 接收到连接请求时if(key.isAcceptable()){handleAccept();}// 读数据if(key.isReadable()){handleRead();}} catch(IOException ex) {ex.printStackTrace();}}} }
http://www.zqtcl.cn/news/642331/

相关文章:

  • 网站建设哪家最好企业商城网站建设方案
  • 舟山市建设工程质量监督站网站网页版微信二维码加载失败
  • 金融网站html5模板给自己家的公司做网站好做吗
  • 新农村建设投诉在哪个网站上海做电缆桥架的公司网站
  • 免费行情100个软件网络优化论文
  • asp.net动态的网站开发个人业务网站带后台
  • 控制网站的大量访问关于实验室建设的英文网站
  • 中国容桂品牌网站建设怎么自己做个网站做链接跳转
  • 安徽省建设工程协会网站昆明官网seo厂家
  • 品牌整合推广搜狗优化好的网站
  • 娄底手机网站制作深圳网站建设怎么做
  • 好的龙岗网站建设附近装修公司电话和地址
  • 网站后台生成文章很慢网络营销毕业设计
  • 如何把资料上传到网站什么叫高端网站定制
  • 郑州企业网站建设团队什么是交换链接
  • 如何建立一个外贸公司网站活动营销的方式有哪些
  • 上海工程造价咨询公司余姚网站seo运营
  • 小加工厂做网站wordpress免费主题破解版
  • 网站打开风险怎么解决企业建设网站网站建设公司
  • 随州网站建设公司wordpress怎样上传主题
  • 做外链等于网站更新么台州椒江网站建设
  • 自己搭建一个博客网站网络营销是什么大类
  • 10元网站备案php企业网站开发实训报告
  • 建筑网站设计大全wordpress模板死循环
  • 网站优化排名软件泌阳网站建设
  • 网站反向绑定域名企业网站的建立网络虚拟社区时对于企业
  • 重庆大渡口网站建设解决方案梓潼 网站建设 有限公司
  • 高端平面网站东营住房和城乡建设厅网站
  • 品牌网站建设e小蝌蚪易时代网站
  • 做搜狗手机网站点击软网站建设有哪些种类