浏览器请求本地接收的信息大概使这个样子滴。
新增连接:/127.0.0.1:65150
GET /src/timthumb.jpg HTTP/1.1
Host: 127.0.0.1:8888
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
Accept: image/webp,image/*,*/*;q=0.8
Referer: http://127.0.0.1:8888/123123
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
当无GET,POST等请求的时候,浏览器请求大概是这个样子滴
GET / HTTP/1.1
Host: 127.0.0.1:8888
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
现在要做的是实现一个接口,获取上述数据并解析get和post请求。
以下是监听器代码
package main.java.per.jerrymouse; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * Created by 爹 on 2016/11/6. * fun:用于监听访问本机某个端口的输入。现在暂时定为8888,以后迭代开发的时候可设置为配置文档更改要监听的端口号。 */ public class ConnectListener { //一个程序只有一个监听器。 private static ServerSocket serverSocket = null; private ServerSocket getLisetener() { if (serverSocket == null) { try { serverSocket = new ServerSocket(8888); } catch (IOException e) { e.printStackTrace(); System.out.println("创建端口监听器失败"); } return serverSocket; } else return serverSocket; } //这里用观察者模式吧,循环监听事件。当有连接进来的时候,就通知观察者开启一个新线程获取socket对象,并处理。 public static void startListening() { ConnectListener connectListener = new ConnectListener(); serverSocket = connectListener.getLisetener(); while (!Thread.interrupted()) { try { Socket socket = serverSocket.accept(); ListenerObserver listenerObserver = ListenerObserver.getListenerObserver(); listenerObserver.getNotice(socket); } catch (IOException e) { e.printStackTrace(); System.out.println("获取观察者失败"); } } } }
用到一个观察者模式,当有connection进入端口后,观察者有反应。
package main.java.per.jerrymouse; import java.io.IOException; import java.net.Socket; /** * Created by 爹 on 2016/11/6. * 端口监听器的观察者 */ public class ListenerObserver { private static ListenerObserver listenerObserver = null; public static ListenerObserver getListenerObserver() { if (listenerObserver == null) { listenerObserver = new ListenerObserver(); return listenerObserver; } else { return listenerObserver; } } void getNotice(Socket socket) throws IOException { NetworkChannel networkChannel = (NetworkChannel) socket; ParseNetworkChannel parseNetworkChannel = new ParseNetworkChannel(); parseNetworkChannel.parseGetInfo(networkChannel); } }
解析前端传过来的东西。现在只是个main方法,我觉得还是把jerrymouse做成jar包,获取它的inputstream和outputstream好一点。
package main.java.per.jerrymouse; import java.io.*; /** * Created by li on 2016/11/6. * 解析前端传输过来的东西。并解析其中get,post信息。 */ public class ParseNetworkChannel { private String getInfo; private String postInfo; String parseGetInfo(NetworkChannel networkChannel) throws IOException { InputStream inputStream = networkChannel.getInputStream(); byte[] bytes = new byte[20480]; inputStream.read(bytes); String allInfo = new String(bytes); System.out.println(allInfo); return null; } public static void main(String[] args) { String s = "新增连接dsdsdsd:/127.0.0.1:51974\n" + "GET /favaaaicon.ico HTTP/1.1\n" + "Host: 127.0.0.1:8888\n" + "Connection: keep-alive\n" + "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36\n" + "Accept: */*\n" + "Referer: http://127.0.0.1:8888/\n" + "Accept-Encoding: gzip, deflate, sdch, br\n" + "Accept-Language: zh-CN,zh;q=0.8"; System.out.println(s.indexOf("GET")); System.out.println(s.indexOf("HTTP/1.1")); char[] chars = s.toCharArray(); for (int i = s.indexOf("GET")+4; i < s.indexOf("HTTP/1.1"); i++) { System.out.print(chars[i]); } } }
哦!忘了还有个包装类。
package main.java.per.jerrymouse; import java.net.Socket; /** * Created by li on 2016/11/6. * 一个包装类,包装Socket. */ public class NetworkChannel extends Socket { }