---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一.网络编程的两个参考模型
网络编程有两个参考模型一个是OSI参考模型,另一个是TCP/IP参考模型,他们的对应分层方式如下:
OSI参考模型 TCP/IP参考模型
应用层
表示层 应用层
会话层
-----------------------------------------------
传输层 传输层
-----------------------------------------------
网络层 网际层
------------------------------------------------
数据链路层 主机至网络层
物理层
-------------------------------------------------
【理解】这两种参考模型在实际的运用中没有多大的区别,TCP/IP参考模型只是将传输层次简化了。在实现网络传输的过程中,数据一般是从最上层向下传输,最后到达物理传输层,在向下传输的过程中,每一次都会对信息进行封包处理,添加该层的特有信息;当接收到了该信息包时,又会自下而上的进行拆包,最终完成信息的传输。
二.通讯要素
(1)IP地址
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
【理解】:当一台计算机需要连接到互联网上的时候,就类似新建成的一栋房子,当它屋里面的事物不需要和外界事物交流的时候,当然就不需要门牌号了,但如果需要和外界交流的时候,就需要一个门牌号(地址),这样其他的事物就可以找到它了。所以IP地址就类似于计算机在互联网世界的门牌号,知道了它的地址自然就可以找到它了。
但是IP地址不易记忆,所以可以用一个名称来代替,如www.baidu.com.而这个名称则需要向DNS代理中找到对应名称www.baidu.com相对应的IP地址,然后返回给调用者,再去访问对应的服务器。
DNS通过键值对的形式记录域名对应的IP地址。
(2)端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0-65535,其中0-1024系统使用或保留端口
【理解】类似于一栋大厦(计算机)有一个地址(IP地址),而大厦中有很多间房子每个房间有一个号码(端口号)。一个人(信息)需要来这栋大厦办事,需要知道大厦地址(IP地址),当然也要知道那个房间(端口号)可以给他办事。所以当信息需要传输到一台计算机的时候,需要知道这台计算机的IP地址和端口号,而这台计算机上的服务器程序,就可以监听对应的端口,从而接受传递过来的信息。
计算机中一定要有运行的程序监听该端口号,来完成信息传输的,这种传输形式称为;TCP传输;而可以没有正在运行的程序监听该端口时,这种传输形式称为UDP传输。因为监听程序可有可无,所以这种传输容易丢失数据。
(3)传输协议
通讯的规则
常见协议:TCP和UDP
【理解】传输协议就是事项定义一种方式,来完成信息的传输;比如送邮件,事先说好,发过来的邮件一定要你亲自接受,否则就是不进行投递(TCP),或者发送来的邮件,你在就给你,你不在我就把它丢了(UDP)
UDP
① 将数据及源和目的封装成数据包中,不需要建立连接
② 每个数据包的大小限制在64K内
③ 因无连接,是不可靠协议⑻不需要建立连接,速度快【如网络会议】
TCP
① 建立连接,形成传输数据的通道
② 在连接中进行大数据量传输
③ 通过三次握手完成连接,是可靠协议⑻必须建立连接,效率会稍低
三.Socket[译:插座]
每一个运用程序都有自己类似于插座,而插座的型号是不一样的
只有匹配的才可以相互连接
Socket就是为了网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
【理解】两个应用程序,需要进行信息的通讯,比如A->B通讯,就需要将两个应用程序“连接”起来,类似与我们将用电器插在电源插座上,插头有两脚的,也有三脚的,当然插座有两孔的,也有三孔的;那么只有两脚对两孔,三脚对三孔,这样才能正常通电。
我们知道通讯必须知道IP地址和端口号,而通讯协议却有两种(TCP和UDP),这就说明两个运用程序要建立连接则有两种方式,这就类似于要建立连接可以使用三脚插头,也可以使用两脚插头,如果使用了两脚插头,那么就得插在两脚插座上。
每个计算机上有两种类型的插座,要么都用三孔通讯,要么都用两孔通讯
UDP通讯使用的插座类型为DatagramSocket
TCP通讯使用的插座类型为Socket(客服端)和ServerSocket(服务端)
四、InetAddress 类
此类表示互联网协议 (IP) 地址。
给类构造方法为私有,如果要创建该类对象,则需要调用其静态方法获取对象,
例如:InetAddressi = InetAddress.getLocalHost();
常用方法:
static InetAddress
getLocalHost()
返回本地主机。
String getHostAddress()
返回 IP 地址字符串(以文本表现形式)
String getHostName()
获取此 IP 地址的主机名。 getAllByName
static InetAddress[ ] getAllByName(Stringhost)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
【DatagramPacket中的getAddress 和Socket,ServerSocket中的getInetAddres都可以获取
一个InetAddress对象】
代码示例:
import java.net.*;
import java.io.*;
import java.util.*;
class IPDemo
{
public static void main(String[] args) throws Exception
{
InetAddress i= InetAddress.getLocalHost();//返回本地主机对象
System.out.println(i.toString());
//PC-201403242043/192.168.0.213【计算机名和IP地址】
System.out.println(i.getHostAddress());
//192.168.0.213
System.out.println(i.getHostName());
// PC-201403242043
InetAddress[] ia =InetAddress.getAllByName("www.baidu.com");
for(InetAddress iax : ia )
{
System.out.println(iax.getHostAddress());
System.out.println(iax.getHostName());
//115.239.211.110
//www.baidu.com
//115.239.210.27
//www.baidu.com
}
}
}
五.UDP传输
(1)DatagramSocket与DatagramPacket
①建立发送端,接受端
②建立数据包
③调用Socket的发送接受方法
④关闭Socket
发送端与接收端是两个独立的运行程序
(2)类 DatagramPacket
此类表示数据报包。
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能
按不同的顺序到达。不对包投递做出保证。
【构造方法摘要】
DatagramPacket(byte[] buf, int length)
构造DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length,InetAddress address, int port)
构造数据报包,用来将长度为length 的包发送到指定主机上的指定端口号。
【方法】
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
代码实例:
/*
需求:通过udp传输方式,将一段文字数据发送出去
思路:
1.建立udpsocket服务
2.提供数据,并将数据封装到数据包中
3.通过socket服务的发送功能,将数据包发送出去
4.关闭资源
*/
class UDPSend
{
publicstatic void main(String[] args) throws Exception
{
//1.创建udp服务,通过DatagramSocket对象
DatagramSocketds = new DatagramSocket();
//2.确定数据,并封装成数据
byte[]buf = "我 来 了 !!".getBytes();
DatagramPacketdp =
NewDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.213"),10000);
//3.通过Socket,将已有数据包发送出去,通过send方法
ds.send(dp);;
//4.关闭资源
ds.close();
}
}
/*
思路;
1.定义udpsocket服务
2.定义一个字节数组,因为要储存接收到的数据,并定义要监听本地那一个端口
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5.关闭资源
*/
class UDPReceive
{
publicstatic void main(String[] args) throws Exception
{
//1.定义UDP的socket服务
DatagramSocketds = new DatagramSocket(10000);
//2.定义一个数据包,因为要存储接受到的字节数据中的不同数据信息
//因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
byte[]buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3.通过服务的receive方法将受到数据存入数据包中。
ds.receive(dp);
//4通过数据包的方法获取其中的数据
Stringip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data+"::"+port);
//5.关闭资源
ds.close();
}
}
六.TCP传输
Socket和ServerSocket
①建立客户端和服务端
②建立连接后,通过Socket中的IO流进行数据的传输
③关闭socket
同样,客服端与服务端是两个独立的应用程序
类 Socket
构造方法摘要
Socket()
通过系统默认类型的SocketImpl 创建未连接套接字
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
【Socket一建立,其本身就包含了输入流和输出流,是内部封装的】
方法
InputStream getInputStream()
返回此套接字的输入流
OutputStream getOutputStream()
返回此套接字的输出流。
!!创建【客户端】
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机
因为tcp是面向连接的,并连接成功,形成通络后,在该通道进行数据的传输
需求:给服务端发送文本数据
【步骤】
1.创建Socket服务,并指定要连接的主机和端口
2.通过getOutputStream()方法,获取socket内部封装的输出流
3.通过获取的输出流向服务端发送数据
4.关闭资源
*/
class TcpClient
{
publicstatic void main(String[] args) throws Exception
{
//1.创建客服端socket服务,指定目的主机和端口
Socket s = newSocket("192.168.0.213",10005);
//2.为了发送数据,应该获取socket流中的输出流
OutputStreamout = s.getOutputStream();
/ /3.发送数据到指定服务端
out.write("wolai le !!!".getBytes());
//4.关闭资源
s.close();
}
}
!!创建【【服务端】
需求:定义端点接受数据并打印在控制台上
类 ServerSocket【类似一个包装类】
构造方法摘要
ServerSocket()
创建非绑定服务器套接字。
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
方法
Socket accept()
侦听并接受到此套接字的连接。
InetAddress getInetAddress()
返回此服务器套接字的本地地址。
【步骤】
1.建立服务端的ServerSocket服务,并监听一个端口
2.获取连接过来的客户端对象。
通过ServerSocket的accept方法,没有连接就会等,所以
这个方法是阻塞式的
3.客户端如果发来数据,那么服务端就使用对应的客服端对象
并获取该客户端对象的读取流来读取客户端发送的数据
4,关闭资源
*/
class TcpServer
{
publicstatic void main(String[] args) throws Exception
{
//1.建立服务端socket服务,并监听一个端口
ServerSocketss = new ServerSocket(10005);
//2.通过accept方法获取连接过来的客户端对象
Sockets = ss.accept();
Stringip = s.getInetAddress().getHostAddress();
intport = s.getPort();
byte[]buf = new byte[1024];//接受数据,缓冲区
//3.获取客户端的读取流,并来读出客户端发送的数据
InputStream is = s.getInputStream();
intlen = is.read(buf);
Stringdata = new String(buf,0,len);
System.out.println("ip:"+ip+"端口:"+port+"::"+data);
//4.关闭资源
s.close();
ss.close();
}
}
【自我总结】
UDP传输
1.创建发送端
首先,生成一个DatagramSocket对象和一个DatagramPacket对象;生成DatagramPacket对象要向传入四个参数,分别是:缓冲区,缓冲区调用的长度,InetAddress对象,端口号;
InetAddress对象可以通过InetAddress.getByName(“主机名”);缓冲区中存入的是要发送的数据。
然后,调用DatagramSocket对象的send方法将DatagramPacket对象发送出去
最后,关闭资源。
2.创建接收端
首先,定义一个DatagramSocket对象,监听相应端口号,创建一数组缓冲区,将这个数组缓冲区传递给一个DatagramPacket对象;
然后,调用DatagramSocket对象的receive,将数据获得并传给DatagramPacket对象;
再次,调用DatagramPacket对象的getData方法获取传入的数组,并返回一个字节数组
最后,关闭资源。
TCP传输
1.创建客服端
首先,定义一个Socket对象,指定传入的主机和端口
然后,获取Socket对象内部的输出流,通过该输出流向服务器发送数据
最后,关闭资源
2.创建服务端
首先,定义一个ServerSocket对象,并指定监听的接口
然后,调用ServerSocket对象的accept方法,获得服务端传过来的Socket对象
再次,调用获取的Socket对象获取客服端传递过来的输入流,将客户端传递过来的数据读取出来。
最后,关闭资源
【实现互访】
TCP传输,客服端和服务端的互访
调用Socket自带的输入流和输出流,输入流的read方法是阻塞式的,要注意不要让他们都等待了。
【实现复制功能】
在文件发送完成之后,要给服务端发送一个结束标记s.isShutDown();s为Socket对象
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com