java socket 模拟,JAVA Socket模拟简单通讯实例(一)

什么是Sokcet?

Socket就是套接字,说白了就是链接的一端。建立网络通讯的双方,都有一个socket,每一个socket都保存有一个此次通讯需要的数据,例如对方的网络地址,端口号等。

有了网络地址,就可以在网络中找到那个需要连接的机器,有了端口号,就知道链接对方机器的哪一块进行数据传输。于是,网络链接就可以产生,流就得以建立,数据就可以进行传输。

socket是一个桥梁,链接了网络通讯中的传输层与应用层。如图,(图片来源百度百科)

d5a32e8af4f236f5716a46204369fb8d.png

传输层规定了传输的规范。常用的有TCP和UDP协议。TCP可靠,开销大,UDP不可靠,开销小。

应用层规定的被传输数据的规范,最最常用的也就是现在所见的网页——来自于CSDN服务器,通过TCP协议传输到浏览器,按照HTTP协议协议写的请求与回复。

注:HTTP协议不一定是基于TCP的,一般是使用TCP协议的80端口进行通讯的。但不使用不可靠的UDP进行通讯。

规范原件原文

“HTTP communication usually takes place over TCP/IP connections. The default port is TCP 80 , but other ports can be used.

This does not preclude HTTP from being implemented on top of any other protocol on the Internet,

or on other networks. HTTP only presumes a reliable transport; any protocol that provides such guarantees can be used;

the mapping of the HTTP/1.1 request and response structures onto the transport data units of the protocol in question is outside the scope

of this specification.”——RFC2616

“HTTP通信通常发生在TCP/IP连接上。默认端口是TCP 80,但可以使用其他端口。这并不妨碍HTTP在Internet上或其他网络上的任何其他协议之上实现。

HTTP是需要一个可靠的传输;任何提供此类担保协议可以使用;映射的HTTP / 1.1请求和响应的结构上的协议数据单元的传输问题范围之外的。

本规范RFC2616。”

Java Socket

java有关socket的内容都在java.net包中。api文档中这么描述。文档中描述的很详细,不在赘述。

java.net 包可以大致分为两个部分:

低级 API,用于处理以下抽象:

地址,也就是网络标识符,如 IP 地址。

套接字,也就是基本双向数据通信机制。

接口,用于描述网络接口。

高级 API,用于处理以下抽象:

URI,表示统一资源标识符。

URL,表示统一资源定位符。

连接,表示到 URL 所指向资源的连接。

地址

在整个 java.net API 中,地址或者用作主机标识符或者用作套接字端点标识符。

InetAddress 类是表示 IP(Internet 协议)地址的抽象。它拥有两个子类:

用于 IPv4 地址的 Inet4Address。

用于 IPv6 地址的 Inet6Address。

但是,在大多数情况下,不必直接处理子类,因为 InetAddress 抽象应该覆盖大多数必需的功能。

关于 IPv6

并非所有系统都支持 IPv6 协议,而当 Java 网络连接堆栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在 IPv6 不可用或被显式禁用的情况下,Inet6Address 对大多数网络连接操作都不再是有效参数。虽然可以保证在查找主机名时 java.net.InetAddress.getByName 之类的方法不返回 Inet6Address,但仍然可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用 Inet6Address 调用时都将抛出异常。

套接字

套接字是在网络上建立机器之间的通信链接的方法。java.net 包提供 4 种套接字:

Socket 是 TCP 客户端 API,通常用于连接远程主机。

ServerSocket 是 TCP 服务器 API,通常接受源于客户端套接字的连接。

DatagramSocket 是 UDP 端点 API,用于发送和接收数据包

MulticastSocket 是 DatagramSocket 的子类,在处理多播组时使用。

使用 TCP 套接字的发送和接收操作需要借助 InputStream 和 OutputStream 来完成,这两者是通过 Socket.getInputStream() 和 Socket.getOutputStream() 方法获取的。

接口

NetworkInterface 类提供 API 以浏览和查询本地机器的所有网络接口(例如,以太网连接或 PPP 端点)。只有通过该类才可以检查是否将所有本地接口都配置为支持 IPv6。

高级 API

java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。这些类为:

URI 是表示在 RFC 2396 中指定的统一资料标识符的类。顾名思义,它只是一个标识符,不直接提供访问资源的方法。

URL 是表示统一资源定位符的类,它既是 URI 的旧式概念又是访问资源的方法。

URLConnection 是根据 URL 创建的,是用于访问 URL 所指向资源的通信链接。此抽象类将大多数工作委托给底层协议处理程序,如 http 或 ftp。

HttpURLConnection 是 URLConnection 的子类,提供一些特定于 HTTP 协议的附加功能。

建议的用法是使用 URI 指定资源,然后在访问资源时将其转换为 URL。从该 URL 可以获取 URLConnection 以进行良好控制,也可以直接获取 InputStream。

下面是一个示例:

URI uri = new URI("http://java.sun.com/");

URL url = uri.toURL();

InputStream in = url.openStream();

协议处理程序

如上所述,URL 和 URLConnection 都依赖于协议处理程序,所以协议处理程序必须存在;否则将抛出异常。此为与 URI 的主要不同点,URI 仅标识资源,所以不必访问协议处理程序。因此,尽管可能利用任何种类的协议方案(例如,myproto://myhost.mydomain/resource/)创建 URI,但类似的 URL 仍将试图实例化指定协议的处理程序;如果指定协议的处理程序不存在,则抛出异常。

默认情况下,协议处理程序从默认位置动态加载。但是,通过设置 java.protocol.handler.pkgs 系统属性也可能增加搜索路径。例如,如果将其设置为 myapp.protocols,则 URL 代码将首先尝试(对于 http 而言)加载 myapp.protocols.http.Handler,然后,如果失败,则尝试从默认位置加载 http.Handler。

注意,处理程序类必须为抽象类 URLStreamHandler 的子类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值