以前一直不太重视java 基础的整理,感觉在实际开发中好像java 基础用处不大,感觉不理解一些底层的东西对开发工作影响也不大。不过,后来我发现,很多东西都是相互联系的,如果底层的东西你不理解,后面的很多与之有联系的工具、框架等用起来会糊里糊涂的,出错之后也不能高效地准确定位,所以,接下来打算好好整理下java SE部分的基础知识,今天首先整理下Socket通讯方面的基础知识。
一、Socket是什么
1、客户与服务器
在接触Socket之前,请先看下面的丑图:
一般来说,现在很多应用都是这样的服务方式:客户端安装在客户的终端那里,而核心业务服务则是在服务器完成,这两者之间的连接依靠网络完成,而抽象出来就是依靠对应的流机制来完成。
但是,在java中,一般不会直接操作网络流来进行通讯,一般通过一个叫做嵌套字的东西进行通讯(可以理解为一部电话),这个类就是Socket,通过操作Socket进行网络通讯,这其实便是用java实现的web容器的底层原理。
2、Socket:个人理解就是一个可以操作网络流的类。
3、ServerSocket:对应服务端的服务器,不过服务器内部也是通过ServerSocket生成对应某个客户的Socket,然后相互操作流进行必要的通信的。
二、Socket的使用方法
1、构造方法的用法(对应连接服务器),看以下简单例子
//Socket创建方法一 public Socket setSocket() throws UnknownHostException, IOException{ String ip = "127.0.0.1"; int port = 8080; Socket socket = new Socket(ip, port);//这里会阻塞 return socket; }
显然,访问一个服务器必须知道它的ip以及端口号,这个就体现在Socket的构造函数上面了。不过这种构造方法是不推荐的,原因是:
new Socket(ip, port)这个构造方法会一直阻塞的,如果网络不好没有响应,则会空等待。所以一般推荐以下的这个方法进行Socket的构造:
public Socket setSocket() throws IOException{ socket = new Socket(); //设置最长等待时间 socket.setSoTimeout(timeout); //进行连接请求 socket.connect(new InetSocketAddress(ip, port)); return socket; }
这里有个设置等待时间,这样,如果网络不好就可以即时响应用户避免过长时间的等待。
2、利用socket进行操作输入输出流
Socket类封装了java对网络流的操作,所以使用起来比较简单,直接使用相应的方法获取对应的流操作即可,请看代码:
//Socket获取网络输入以及输出流 //获取输输入 public InputStream getInputStream(Socket socket) throws IOException{ return socket.getInputStream(); } //获取输出流 public OutputStream getOutputStream(Socket socket) throws IOException{ return socket.getOutputStream(); }
然后,获取流之后,所有通讯通过流进行就行啦,是不是炒鸡简单!
三、ServerSocket的使用方法
1、核心方法:SocketServer.accept(),具体用法请先看代码例子:
//服务端监听方法 public void listener() throws IOException{ Socket socket = null; int i = 0; while(true){ i++; socket = server.accept();//这也是个阻塞的方法来的 System.out.println("有" + i + "个用户连接了服务器"); new Thread(new ServerDoThread(socket)).start(); } }
accept也是个阻塞的方法来的,它不停地监听着对应端口有没有请求进来,如果有,则进行相应操作。一般来说,如果服务器是多用户的话,有用户请求进来便会调用线程进行处理(这里是直接新建一个线程)
2、ServerSocket与客户端具体的通讯流程:
请先看丑图
显然,服务端进行通讯的话,同样需要获取Socket,然后重复二中的步骤进行响应。
所以,是不是很简单呢!所以,其实web服务器的基本工作流程和Socket 以及ServerSocket的工作流程差不多,只是多了复杂的处理内部并发问题的优化代码罢了,所以,学了Sokcet 以及ServerSocket,你就可以勇敢的说:我也可以写个Tomcat啦!
Ok,Socket 和ServerSocket的基本知识整理到这里,下一个博客将着重整理下长连接以及短连接的问题!