java'如何从socket中判断是不是http协议?
比如客户端和服务器建立了socket链接和握手,这个链接中可能是任意数据,有可能是http,也有可能是websocket,但是socket的是基于流的,没有办法知道边界,有办法像Wireshark一样提取出来http请求吗,主要是这个socket不止有http请求 留个记号,用时再来读读tomcat源码就知道了 楼上说的阅读源码是很好的方法,我没读过源码,估计也不会很好读懂,但是既然已经涉及到了通信的底层,那么不难得到你想要的东西,比如http协议需要有请求头,那么可以看看http协议的组成以及在socket上的封装,然后在socket中判断是否有这种封装结构,这样就可以实现判断了 Good Question!初看一懵,细看更加的懵,这种懵是那种怀疑人生,怀疑自己这几年白干了的懵。而后我专门了解了一些http,websocket, socket 这三个概念, 尤其是websocket 和socket。
简单来说,websocket是类似http的协议,websocket的开启基于http , 连接后为双向通信,就和http没有关系了。socket 是一个概念,没有实际的落地实现,是一个思想层面的东西, 就像我们都说的oop。
参考:https://www.jianshu.com/p/59b5594ffbb0
并且 我得结论是,你这个问题不会有结论{:1_935:} 看报文呀,http跟websocket的报文肯定不一样吧
GET /thread-1739729-1-1.html HTTP/1.1
Host: www.52pojie.cn
Connection: keep-alive
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Language: zh-CN,zh;q=0.9
Cookie: ******
Accept-Encoding: gzip, deflate
你看,这个就是一个本页面的请求数据,只要能解析出这些东西就可以确定是个HTTP请求,其实只要关注前2行,这是必须的。 websocket关注这几个参数
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key
Sec-WebSocket-Protocol
Sec-WebSocket-Version Naylor 发表于 2023-1-30 09:45
Good Question!初看一懵,细看更加的懵,这种懵是那种怀疑人生,怀疑自己这几年白干了的懵。而后我专门了 ...
socket是tcp流啊 http和websocket都是基于流进行自定义协议的
页:
[1]
2