首页 > 代码库 > Socket

Socket

    虽然网络上的标准是七层,不过真正开发中使用的只有TCP/IP四层

  1. 应用层 -------------------->我们实际开发就是这一层
  2. 传输层     -------------------->对应这TCP和UDP两种协议
  3. 网络层     -------------------->网络层对应着IP
  4. 数据链路层 -------------------->

Java底层封装了底层的实现提供了net包支持网络编程。不同进程之间的通行就是使用了端口号,同一个端口号只能被

一个进程监听。当时TCP和UDP可以同时监听一个端口而不影响。在计算机网络中。我们访问某台计算机就是采用了IP加端

号方式实现的。如我们常用的浏览器输入网址时候。如www.baidu.com中www是协议名字 baidu.com是DNS中注册的地址。

通过DNS就可以反查询到IP地址。其实后面baidu.com后面省略了www中默认的端口号80.

    URL提供了网络定位。URL里面有个openConnection可以访问URL对象描述的地址。

    Socket/ServerSocket提供可TCP编程的访问Socket和服务器ServerSocket. ServerSocket对象通过监听某个端口号码.当

访问指定端口号码时候会创建一个socket对象。Socket对象之间的通信采用IO流的操作。

    这里写一段代码模拟下用浏览器访问网站时候的过程

 1 import java.io.BufferedReader; 2  3 import java.io.IOException; 4  5 import java.io.InputStream; 6  7 import java.io.InputStreamReader; 8  9 import java.io.OutputStream;10 11 import java.io.PrintWriter;12 13 import java.io.Reader;14 15 import java.net.ServerSocket;16 17 import java.net.Socket;18 19  20 21  22 23 public class MySocketService24 25 {26 27     public static void main(String[] args) throws IOException28 29     {30 31         ServerSocket ss=new ServerSocket(8080);32 33         Socket socket=ss.accept();34 35         InputStream is=socket.getInputStream();36 37         String str=printfInputStreamString(socket.getInputStream());38 39         OutputStream os=socket.getOutputStream();40 41         PrintWriter pw=new PrintWriter(os);42 43         System.out.println(str);44 45         pw.write(str);46 47         pw.close();48 49         is.close();50 51         socket.close();52 53         ss.close();54 55         56 57     }58 59     public static String printfInputStreamString(InputStream is)60 61             throws IOException62 63     {64 65         StringBuilder sb=new StringBuilder();66 67         Reader reader=new InputStreamReader(is);68 69         BufferedReader br=new BufferedReader(reader);70 71         String str=null;72 73         while((str=br.readLine())!=null&& !str.equals(""))74 75         {76 77             sb.append(str);78 79             sb.append("\n");80 81         }82 83         sb.trimToSize();84 85         return sb.toString();86 87     }88 89 }

 

当用浏览器访问http://localhost:8080/的时候就会打印出Http协议的一些信息

解析第一行字符串就可以得到客户端想访问的的资源。

当然以上只能算是模拟,因为设计到线程问题。暂时还没找到一个合理的处理方式。到以后写个加强版的模拟吧。

Socket