一、网络模型分类
OSI参考模型、TCP/IP参考模型
主要了解TCP/IP
TCP/IP五层模型的协议
应用层
传输层:四层交换机、也有工作在四层的路由器
网络层:路由器、三层交换机
数据链路层:网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)
物理层:中继器、集线器、还有我们通常说的双绞线也工作在物理层
二、网络通信知识点
IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号用于识别具体接收软件
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口。
传输协议
通讯的规则
常见协议:TCP,UDP
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号用于识别具体接收软件
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口。
传输协议
通讯的规则
常见协议:TCP,UDP
1.
UDP:
QQ来记忆特点
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
2.
TCP:
迅雷来记忆特点
建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
3.
socket:
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输
4.
创建UDP
- 思路:建立UDP的socket服务
- 提供数据,并将数据封装在数据包中
- 通过socket服务端的发送功能,将数据包也发送出去
- 关闭资源(io的资源)
class UdpSend
{
public static void main(String[] args) throws Exception//有io异常、socket异常和未知主机异常等
{
//1,创建udp服务。通过DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);
//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf = "udp ge men lai le ".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
//3,通过socket服务,将已有的数据包发送出去。通过send方法。
ds.send(dp);
//4,关闭资源。
ds.close();
}
}
接收思路:
- 定义UDPsocket服务
- 定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节
- 通过socket服务的receive方法将受到的数据存入定义好的数据包中
- 通过数据包对象的特有功能,将不同数据取出,打印到控制台
- 关闭资源
class UdpRece
{
public static void main(String[] args) throws Exception
{
//1,创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
//2,定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3,通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//这里是阻塞式方法。所以上面可以用while(true)!!!
//4,通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
}
//5,关闭资源
//ds.close();
}
}
注意:定义一个数据包在接收端,要指定监听的端口。
DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();
键盘录入操作
class UdpSend2
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));//io中键盘录入标准语句,必须记住不加思索!
String line = null;
//读取键盘录入,并发送
while((line=bufr.readLine())!=null)
{//用886结束键盘录入,判断
if("886".equals(line))
break;//跳出循环
//数组接收键盘的数据
byte[] buf = line.getBytes();
//发送操作
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);
ds.send(dp);
}
ds.close();//关闭流
}
}
5.
TCP
与UDP不同,他的两个端点不一样
socket客户端。
通过socket的构造方法发现,当它初始化的时候就必须连接到目的端,这里体现了TCP是面向连接的!!
ServerSocket服务端
客户端:通过查询socket对象,发现该对象在建立时,就可以连接指定主机。。
客户端:通过查询socket对象,发现该对象在建立时,就可以连接指定主机。。
因为TCP实现面向连接的。所以在建立socket服务时,就要有客户端存在,并连接成功。形成通路后,在该通道进行数据传输。
步骤:
- 创建socket服务,并指定要连接的主机和端口。
- 获取socket流中的输出流
- 关闭socket,不用关闭流操作,因为socket关闭时同时会关闭IO流的
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003);
//为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le ".getBytes());
s.close();
}
}
服务端:
- 建立服务端的socket服务,ServerSocket();并监听一个端口
- 获取链接过来的客户端对象,通过accept方法,注意这个方法也是阻塞的
- 客户端如果发来数据,那么服务端要使用对应的客户端对象,获取该对象读取流的的数据
- 关闭服务端
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端.
}
//ss.close();
}
}
Tcp传输最容易出现的问题
客户端连接上服务端,两端都在等待,没有任何数据传输。
通过例程分析:
因为read方法或者readLine方法是阻塞式。
解决办法:
自定义结束标记
使用shutdownInput,shutdownOutput方法。
总结:理解TCP与UDP的区别,(用QQ迅雷来记忆他们的特点)。掌握TCP UDP的客户端接收端的原理!