网络编程(一)

title: 网络编程(一)

Socket 协议的工作原理和基本概念

Socket 的中文翻译是套接字,它是 TCP/IP 网络环境下应用程序与底层通信驱动程序之间运行的开发接口,它可以将应用程序与具体的 TCP/IP 隔离开来,使得应用程序不需要了解 TCP/IP 的具体细节,就能够实现数据传输。

在网络应用程序中,Socket 通信时基于客户端/服务器端结构的。客户端是发送数据的一方,而服务器则时刻准备着接收来自客户端的数据,并对客户端做出响应。

就像送快递一样,客户端像是快递员,服务端像是买家。客户端需要知道东西发到那里去(主机IP),以及需要知道发给谁(应用程序所使用的端口)。而服务端呢要一直等待货物(消息)的到来,如果服务端突然不等了,那么客户端就无法把消息传给服务器。正如快递员无法把货物交付到买家手里一样。

Socket 编程的层级结构:

应用层
Socket 开发接口
传输层
TCP | UDP
网络层 IP
驱动
物理层

Socket 的服务方式和类型

根据居于的底层协议不同,Socket 开发接口可以提供面向连接和无连接两种服务方式。

在面向连接的服务方式中,每次完整的数据传输都要经过建立连接、使用连接和关闭连接的过程。连接相当于一个传输管道,因此在数据传输过程中,分组数据包中不需要指定目的地址。TCP 提供面向对象连接的虚电路。基于面向连接服务方式的应用包括 Telnet 和 FTP 等。

在无连接方式中,每次数据传输时并不需要建立连接,因此每个分组数据包中必须包含完整的目的地址,并且每个数据包都独立地在网络中传输。无连接服务不能保证分组的先后顺序,不能保证数据传输的可靠性。UDP 提供无连接的数据报服务。基于无连接服务的应用包括简单网络管理协议(SNMP)等。

在 Socket 通信中,套接字分为三种类型,即流式套接字(SOCK_STREAM),数据报式套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)。

比较项目流式套接字数据报式套接字
建立和释放连接TF
保证数据到达TF
按发送顺序接收数据TF
通信数据包含完整的目的地址信息FT

windows 网络编程

服务器和客户机进程实现面向连接的 Socket 通信的过程:

服务器程序要先于客户机程序启动,每个步骤中调用的 Socket 函数如下:

(1) 调用 WSAStartup() 函数加载 Windows Sockets 动态库,然后调用 socket() 函数创建一个流式套接字,返回套接字号 s。

(2) 调用 bind() 函数将套接字 s 绑定到一个已知的地址,通常为本地 IP 地址。

(3) 调用 listen() 函数将套接字 s 设置为监听模式,准备好接收来自各个客户机的连接请求。

(4) 调用 accept() 函数等待接受客户端的连接请求。

(5) 如果接收到客户端的请求,则 accept() 函数返回,得到新的套接字 ns。

(6) 调用 recv() 函数接收来自客户端的数据,调用 send() 函数向客户端发送数据。

(7) 与客户端的通信结束后,服务器程序可以调用 shutdown() 函数通知对方不再发送或接收数据,也可以由客户端程序断开连接。断开连接后,服务器进程调用 closesocket() 函数关闭套接字 ns。此后服务器程序返回第 4 步,继续等待客户端进程的连接。

(8) 如果要退出服务器程序,则调用 closesocket() 函数关闭最初的套接字。

客户端程序在每一步骤中使用的函数如下:

(1) 调用 WSAStartup() 函数加载 Windows Sockets 动态库,然后调用 socket() 函数创建一个流式套接字,返回套接字号 s。

(2) 调用 connect() 函数将套接字 s 连接到服务器。

(3) 调用 send() 函数向服务器发送数据,调用 recv() 函数接收来自服务器的数据。

(4) 与服务器的通信结束后,客户端程序可以调用 shutdown() 函数通知对方不再发送或接收数据,也可以有服务器程序断开连接。断开连接后,客户端进程调用 closesocket() 函数关闭套接字。

Java 网络编程

Java 网络编程主要有以下四个类:URL、Socket、InetAddress 和 DatagramSocket。

URL类

Java.net 包中的 URL 类是对 URL 的抽象,使用 URL 创建对象的应用程序称为客户端程序,一个 URL 对象存放着一个具体的资源引用,表明客户端要访问这个 URL 中的资源,利用 URL 对象可以获取 URL 中的资源。一个 URL 对象通常包含最基本的三部分信息:协议、地址、资源。

URL的构造方法

  • public URL(String spee) throws MalformedURLException —— 使用字符串初始化一个 URL 对象,如

try { url = new URL("http://www.hacker97.cn"); }
catch (MalformedURLException e) { System.out.println("Bad URL: " + URL); }

该 URL 对象使用的协议是 HTTP,即用户按照这种协议与指定的服务器通信,该 URL 对象包含的地址是 "www.hacker97.cn",所包含的资源是默认的资源(主页)。

  • public URL (String protocol, String host, String file) throws MalformedURLException —— 构造的 URL 对象的协议、地址和资源分别由参数 protocol、host 和 file 指定。

读取 URL 中的资源

URL 对象调用 InputStream openStream() 方法可以返回一个输入流,该输入流指向 URL 对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户机。

显示 URL 资源中的 HTML 文件

如果希望看到网页的运行效果,则需要 javax.swing 包中的 JEditorPane 类来解释执行 HTML 文件。

JEditorPane 类的构造方法:

public JEditorPane()
public JEditorPane(URL initialPage) throws IOException
public JEditorPane(String url) throws IOException

可以构造 JEditorPane 对象。后两个构造方法使用的参数 initialPage 或 url 指定该对象最初显示的 URL 中的资源。JEditorPane 对象调用 public void setPage(URL page) throws IOException 方法可以显示新的 URL 中的资源。

处理超链接

当 JEditorPane 对象调用 setEditable() 方法将编辑属性设为 false 时,不仅可以显示网页的运行效果,而且用户如果单击网页中链接,还可以使得 JEditorPane 对象触发 HyperlinkEvent 事件。程序可以通过处理 HyperlinkEvent 事件,来显示新的 URL 资源。JEditorPane 对象调用 addHyperlinkListener(HyperlinkListener listener) 获得监视器。监视器需实现 HyperlinkListener 接口,该接口中的方法如下:void hyperlinkUpdate(HyperlinkEvent e).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值