网络编程概述
网络模型
- OSI(Open System Interconnection:开放式系统互联)参考模型
- TCP/IP参考模型
A主机往B主机发送数据数据是如何传输的?
A:传输数据
1.应用层:主要是一些终端应用,比如FTP、WEB浏览器、QQ等。应用层将数据进行封装,加上应用层的特征,然后数据传到表示层
2.表示层:接收到应用层的数据进行格式化、加密等一些列处理,加上表示层的特征,然会将数据传入到会话层
3.会话层:接收到表示层的数据后建立会话,加上会话层的特征,然后将数据传入到传输层
4.传输层:定义了一些传输数据的协议和端口,接收到会话层的数据后建立连接,加上传输层的特征,然后将数据传入到网络层
5.网络层:接收到传输层的数据包后进行逻辑地址寻址,实现不同网络之间的路径选择(如:寻找IP地址、选择路由等),处理好数据加上网络层的特征,并将数据包传入到下一层。
6.数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等,然后将数据包传入到物理层。
7.物理层:通过物理连接(网线、无线、蓝牙等)将数据发送到B服务器
B:接收数据
从底层将数据一层层的进行拆包并解析,最终传输到应用层。
OSI参考模型 | TCP/IP参考模型 |
---|---|
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 主机至网络层 |
物理层 |
图解
网络通讯三要素
- IP地址
网络中设备的唯一标识。本机Ip地址可用127.0.0.1表示,主机名:localhost
- 端口
用于标识进程的逻辑地址,不同进程的标识
有效端口:0 ~ 65536,其中0 ~1024为系统使用或保留端口
- 传输协议
通讯的规则。常见协议:TCP,UDP
TCP和UDP
- UDP(User Datagram Protocol:用户数据报协议)
不需要建立连接,是不可靠协议;
传输速度块;
数据需要封包,每个数据包的大小限制在64k以内;
- TCP
需要建立连接
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
因为要建立连接,所以效率没有UDP高
socket
- Socket就是为网络服务提供的一种机制。
- 通信的两端都有Socket。
- 网络通信其实就是Socket间的通信。
- 数据在两个Socket间通过IO传输
UDP实例
import java.io.IOException;
import java.net.*;
/*
通过udp传输方式,将一段文字数据发送出去
思路:
1、建立udpsocket服务
2、提供数据,并将数据封装到数据包中
3、通过socket服务的发送功能,将数据包发送出去
4、关闭资源
*/
class UDPSend{
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
byte[] buf = "udp send service".getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
ds.send(dp);
ds.close();
}
}
/*
接收UDP协议传输的数据包
思路:
1、定义udpsocket服务,通常会监听一个端口。
2、定义一个数据包,存储接收到的数据
3、通过socket服务的receive将收到的数据存入已定义好的数据包中
4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5、关闭资源
*/
class UDPRecive{
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(10001);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
ds.close();
}
}
TCP实例
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
演示TCP传输
1、tcp分客户端和服务端
2、客户端对应的对象是socket
服务端对应的对象是ServerSocked
*/
/*
客户端:
建立socket对象时就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,就要有服务端存在并连接成功。形成通道后,在该通道进行数据传输
思路:
1.创建socket服务,并指定连接地址和端口
*/
class TCPClient{
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",10003);
//获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp client start".getBytes());
s.close();
}
}
/*
服务端:
1.建立服务端socket对象,并并监听一个端口
2.获取链接过来的客户端对象。通过ServerSocket的accept方法。没有连接就会等待,所以这个方法是阻塞式的。
3.客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
4.关闭服务端(可选)
*/
class TCPServer{
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10003);
Socket accept = serverSocket.accept();
String ip = accept.getInetAddress().getHostAddress();
System.out.println("Ip:"+ip);
InputStream inputStream = accept.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
System.out.println(new String(buf,0,len));
accept.close(); //关闭客户端
serverSocket.close(); //关闭服务端
}
}