产业气象站|还让我手动写个HTTP协议代码,三次握手和四次挥手说完了( 三 )
那么我们怎么去手写一个HTTP协议呢?代码送上:
【产业气象站|还让我手动写个HTTP协议代码,三次握手和四次挥手说完了】publicclassServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketChannelssc=ServerSocketChannel.open()ssc.socket().bind(newInetSocketAddress(8080))ssc.configureBlocking(false)Selectorselector=Selector.open()ssc.register(selector,SelectionKey.OP_ACCEPT)while(true){if(selector.select(3000)==0){continue}Iterator
keyIterator=selector.selectedKeys().iterator()while(keyIterator.hasNext()){SelectionKeykey=keyIterator.next()newThread(newHttpHandler(key)).run()keyIterator.remove()}}}privatestaticclassHttpHandlerimplementsRunnable{privateintbufferSize=1024privateStringlocalCharset="UTF-8"privateSelectionKeykeypublicHttpHandler(SelectionKeykey){this.key=key}publicvoidhandleAccept()throwsIOException{SocketChannelclientChannel=((ServerSocketChannel)key.channel()).accept()clientChannel.configureBlocking(false)clientChannel.register(key.selector(),SelectionKey.OP_READ,ByteBuffer.allocate(bufferSize))}@Overridepublicvoidrun(){try{if(key.isAcceptable()){handleAccept()}if(key.isReadable()){handleRead()}}catch(IOExceptione){e.printStackTrace()}}publicvoidhandleRead()throwsIOException{SocketChannelsc=(SocketChannel)key.channel()ByteBufferbuffer=(ByteBuffer)key.attachment()buffer.clear()if(sc.read(buffer)==-1){sc.close()}else{buffer.flip()StringreceiveString=Charset.forName(localCharset).newDecoder().decode(buffer).toString()String[]requestMessage=receiveString.split("
")for(Strings:requestMessage){System.out.println(s)if(s.isEmpty()){break}String[]firstLine=requestMessage[0].split("")System.out.println()System.out.println("Method:"+firstLine[0])System.out.println("url:"+firstLine[1])System.out.println("HTTPVersion:"+firstLine[2])System.out.println()StringBuffersendString=newStringBuffer()sendString.append("HTTP/1.1200OK
")sendString.append("Content-Type:text/htmlcharset="+localCharset+"
")sendString.append("
")sendString.append("")sendString.append("接受到的请求报文是:")for(Strings1:requestMessage){sendString.append(s1+"")}sendString.append("")buffer=ByteBuffer.wrap(sendString.toString().getBytes(localCharset))sc.write(buffer)sc.close()}}}}}
文章图片
这是一个简单的实现 , 只是实现思路 , 并不是真正的处理请求 , 而大家也要注意设置Content-Type的类型 , 不然容易出问题的 , 毕竟长度是有限制的 。
【来源:Java架构师之路】
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。 邮箱地址:newmedia@xxcb.cn
推荐阅读
- 产业气象站|5G基站太耗电!三大运营商正式官宣:将智能化关闭5G基站节约电费
- 产业气象站|他从不打无准备之仗,华为联手哈工大究竟想干啥?依任总性格
- 产业气象站|G是否影响健康?,张朝阳用手机保持30厘米
- 爱集微APP|“芯”势力助推游戏产业发展,芯片成为ChinaJoy的关键词之一
- 产业气象站|电力机器人“小白”上岗巡检
- 产业气象站|苏宁智能宣布五项Biu+共享政策,从生态赋能到生态共享
- 产业气象站|点赞“中国芯里的南大智慧”!华为公司CEO任正非一行访问南京大学
- 产业气象站|花多少钱收购,微软正在谈判收购TikTok美国业务
- 产业气象站|包括王兴,马云创办支付宝的本质不是为了支付,很多人没理解
- 上观新闻|半导体产业如何发展?嘉定举办的这个论坛指明了方向