网络编程

来源:互联网 发布:男士袜子 知乎 编辑:程序博客网 时间:2024/06/05 10:08

通信过程:

1.        找到对方IP

2.        数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行标识。为了方便称呼这些数字,将其叫做端口,逻辑端口。

3.        定义通信规则。即协议,国际组织定义了通讯协议TCP/IP。

TCP/IP简介

TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)

TCP/IP中的通信协议:

TCP (传输控制协议) - 应用程序之间通信

UDP (用户数据包协议) - 应用程序之间的简单通信

IP (网际协议) - 计算机之间的通信

ICMP (因特网消息控制协议) - 针对错误和状态

DHCP (动态主机配置协议) - 针对动态寻址

TCP/IP 寻址

IP 地址

 IP 地址:220.165.239.44。TCP/IP 使用 4 个数字来为计算机编址。每个计算机必须有一个唯一的 4 个数字的地址。

域名

12 个阿拉伯数字很难记忆。使用一个名称更容易。对此就将 TCP/IP 地址进行命名,eg:w3school.com.cn 就是一个域名。

当你键入一个像 http://www.w3school.com.cn 这样的域名,域名会被一种 DNS 程序翻译为数字。在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。


网络模型

OSI参考模型

TCP/IP模型

Eg:QQ传输

应用层

应用层

将数据进行对应层的特征进行打包

表示层

会话层

传输层

传输层

UDP/TCP协议信息

网络层

网际层

给定数据IP地址

数据链路层

主机至网络层

 

物理层

网线、端口、网卡

 

通讯三要素:

1.        IP地址:网络中设备的标识,本地回环地址:127.0.0.1,主机名:localhost;

2.        端口号:用于标记过程的逻辑地址,不用进程的标识。有效端口:0~65535,其中0~1024为系统使用或者保留的端口。

3.        传输协议

传输协议:

UDP:

1.        将数据及源和目的地址封装在数据包中,不需要建立连接。(这里需要明确目的地址,面向的为无连接)

2.        每个数据包大小在60K内。(将大数据封装成小数据,会自动分包,每包<60k)

3.        因为为无连接,因此是不可靠协议

4.        不需要建立连接,因此速度很快

Eg:视频会议,桌面共享(类似对讲机)

 

TCP

1.        建立连接,形成传输数据的通道

2.        在连接中进行大数据量传输

3.        通过三次握手完成连接,是可靠协议

4.        必须建立连接,因此效率低

EG:打电话,下载

 

Socket:

为网络服务提供一种机制。(类似于客户端的数据港口)

通信两端都有Socket,网络通信就是Socket间的通信,数据再两个Socket之间进行传输。

UDP的Socket服务

发送步骤:

1.        建立UDP Socket服务(断点):创建DatagramSocket;

2.        提供数据,并将数据封装至包中:创建DatagramPacket

3.        通过Socket发送功能发送:通过DatagramSocket进行发送

4.        关闭资源:关闭DatagramSocket


接收步骤

1.        建立UDP Socket服务,坚守某个端点:创建DatagramSocket

2.        定义一个数据包,因为要存储接收到的字节流:创建DatagramPacket

3.        通过Socket服务的receive方法将数据存入定义好的数据包中(阻塞式方法,通过DatagramSocket进行接收)

4.        通过数据包对象的特有功能,将这些数据取出;通过DatagramPacket取出。

5.        关闭资源。


INetAdderss类:

IP地址类,使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。

构造方法:

 

常用方法:

static InetAddress

getLocalHost()
          返回本地主机。

 String

getHostName()
          获取此 IP 地址的主机名。

 String

toString()
          将此 IP 地址转换为 String。

 byte[]

getAddress()
          返回此 InetAddress 对象的原始 IP 地址。

static InetAddress

getByName(String host)
          在给定主机名的情况下确定主机的 IP 地址。

获取指定主机的IP对象。

static InetAddress

getByAddress(byte[] addr)
          在给定原始 IP 地址的情况下,返回 InetAddress 对象。

static InetAddress[]

getAllByName(String host)
          
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

 

 

DatagramSocket类:

用来发送和接收数据报包的套接字。

构造方法:

DatagramSocket(int port,InetAddress laddr)
          创建数据报套接字,将其绑定到指定的本地地址。

常用方法

 void

receive(DatagramPacket p)
          从此套接字接收数据报包。

 void

send(DatagramPacket p)
          从此套接字发送数据报包。

 

DatagramPacket类:

用来实现无连接包投递服务。可以利用其中的方法得到关于数据的信息。

构造函数:

DatagramPacket(byte[] buf, int length)
          构造 DatagramPacket,用来接收长度为 length 的数据包。

DatagramPacket(byte[] buf, int length,InetAddress address, int port)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

DatagramPacket(byte[] buf, int offset, int length)
          构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。

常用方法

void

setAddress(InetAddress iaddr)
          设置要将此数据报发往的那台机器的 IP 地址。

 byte[]

getData()
         
 返回数据缓冲区。

 int

getLength()
          
返回将要发送或接收到的数据的长度。

 int

getPort()
          
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

 

 

Tcp传输

客户端建立

创建客户端Socket服务,指定要连接的主机和端口:Socket


服务端建立

1.        建立服务端的Socket服务,ServerSocket

2.        获取连接过来的客户端对象,通过SercerSocket的accept完成(阻塞式的)

3.        客户端若发送数据,服务端要使用对应的客户端对象,并获取该客户端对象的读取流。

4.        关闭服务端和客户端(防止客户端占用资源)


客户端响应

1.        获取Socket中的输入流,收取服务端的反馈数据。

2.        关闭服务端资源

 

注意:服务端和客户端都是用的是阻塞式方法,这些方法在没有读到结束标记就一致等,而导致两端都在等待。

Socket类:

构造函数

Socket(InetAddress address,int port)
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 

其他方法:

InputStream

getInputStream()
          返回此套接字的输入流。

OutputStream

getOutputStream()
          返回此套接字的输出流。

 int

getPort()
          返回此套接字连接到的远程端口。

InetAddress

getLocalAddress()
          获取套接字绑定的本地地址。

 InetAddress

getInetAddress()
          返回套接字连接的地址。

 

ServerSocket类:

构造方法:

ServerSocket(int port)
          创建绑定到特定端口的服务器套接字。

 

ServerSocket(int port, int backlog)
          利用指定的 backlog创建服务器套接字并将其绑定到指定的本地端口号。这里表明最大的连接数。

 

 

其他方法

Socket

accept()
          侦听并接受到此套接字的连接。

 void

close()
          关闭此套接字。

boolean

isClosed()
          返回套接字的关闭状态。

 void

shutdownInput()
          此套接字的输入流置于“流的末尾”。

 void

shutdownOutput()
          禁用此套接字的输出流。

 

 

TCP ”VS” UDP

1.        UDP分为发送数据端(DatagramSocket)和接受数据段(DatagramPacket),Tcp分为客户端(Socket)和服务端(ServerSocket)。

2.        TCP的客户端的Socket对象在建立时,就连接指定的主机,因此在建立服务时就需要有服务端存在,并连接成功。再改通道进行传输。

 

客户端对服务器的请求命令行:


53行:我们所遵循的规则;

54行:我们所能支持的数据格式

57行:语言

58行:数据压缩方式

61行:主机位置

为了将这些数据进行提取,我们使用URL类对象进行数据的提取。

网络知识:

输入网址之后内部工作原理:

1.        进行域名解析,将网址进行解析。(访问公网上的域名解析服务器)

2.        找到主机与IP地址的映射关系:获取DNS。(获取对应主机的地址IP)

3.        客户机获取DNS并向DNS服务器再次发起请求。(正式访问服务器)

 

 

练习

UDP接收:

UDP客户端互相发送数据



 

TCP客户端与服务端通信

 

TCP服务端转大写返回给客户端

注意这里的阻塞式方法,bufIn.readLine()需要收到换行符之后才会认为读取完毕。我们可以用PrintWriter类来替代。从而免除刷新和换行。

 

TCP服务端多客户端登陆:

为了能让服务端能处理多个客户,就需要将每个客户封装到一个单独的线程中。

 




URL类:

构造函数:

URL(String spec)
          根据 String 表示形式创建 URL 对象。

其他方法:

 String

getHost()
          获取此 URL 的主机名(如果适用)。

 String

getProtocol()
          获取此 URL 的协议名称。

 int

getPort()
          获取此 URL 的端口号。

 String

getPath()
          获取此 URL 的路径部分。

String

getFile()
          获取此 URL 的文件名。

 String

getQuery()
          获取此 URL 的查询部分。

Query得到的是特殊信息。

 


URLConnection

openConnection()
          返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

直接用URL对象进行连接,省去了Socket连接这一步。在获得URLConnection对象之后可以直接用其方法:(URL为应用层对象)

 InputStream

getInputStream()
          返回从此打开的连接读取的输入流。

 OutputStream

getOutputStream()
          
返回写入到此连接的输出流。

获取数据


0 0