计算机网络是通过传输介质,通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输的系统。
网络编程就是编写程序是联网的两个或者多个设备直接进行传输。
OSI七层网络模型 称为开放系统互联模型,是由国际标准化组织提出的,是一个逻辑意义上得定义,一个规范,它把网络从逻辑上分成了7层。每一层都有相关,相对应的设备,比如路由器,交换机。 OSI七层网络模型是一种框架性的设计方法,建立七层模型的主要目的是为解决异种网络互连时的兼容性问题 ,其最主要功能是 帮助不同类型的主机实现数据传输。最大优点 是将服务 ,接口 和协议这三个概念明确的区分开来,通过七个层次化的结构模型使不同的网路之间实现了可靠的通信。
建立七层模型的主要目的是为解决异种网络互联时所遇到的兼容性问题。它的最大优点是将服务,接口,协议 这三个概念明确区分开: 服务表示本层能为上一层提供什么功能,接口说明上一层如何使用下一层服务,协议涉及本层如何实现本层的服务 。这样各层之间具有很强的独立性,互联网络中各实体采用什么样的协议也是没有限制的,只要向上提供相同的服务并且不改变邻层的接口 就可以。 网络七层的划分也是为了使网络的不同功能模板(不同层次)分担不同的职责,从而带来以下好处:
OSI模型 | |
---|---|
应用层 | FTP、HTTP、SMTP |
表示层 | 对应用层的数据进行封装,校验,加密等操作 |
会话层 | 在于对通信开始,结束,异常中断进行处理 |
传输层 | 保持通信双方端对端的联系(端口) |
网络层 | 在于通信双方主机与主机的联系(IP) |
数据链路层 | 保证网络中相邻节点的可靠通信,物理地址(Mac地址--网卡 -->arp,rarp) A->网关(路由器)->基站->网关->B |
物理层 | 数据以bit流的形式在通信介质上传输 |
65536(2^32)个端口,端口1-1024为系统端口,1024以后为可以自由使用的端口。
任意一层修改都不会影响其他层。
ISO制定的OSI参考模型过于庞大、复杂招致了很多批评。由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
OSI模型 | TCP/IP模型 | 数据形式 |
---|---|---|
应用层 | 应用层 | |
表示层 | ||
会话层 | ||
传输层 | 传输层 | 数据段 |
网络层 | 网络层(网络互联层) | 数据包 |
数据链路层 | 网络接口层(主机到网络层) | 帧 |
物理层 | bit |
把分组发往目标网络或者主机。同时,为了尽快地发送分组,可能需要沿不同地路径同时进行分组传递。因此,分组到达顺序和发送顺序可能不同加粗样式,这就需要上层对分组进行排序。网络层除了需要完成路由功能外,也可以完成将不同类型的网络(异构网)互联的任务。除此之外,网络互联层还需要完成拥塞控制的功能。
服务端(Server) | 客户端(Client) |
---|---|
bind(端口) | |
connnect(连接 IP+端口) | |
listen(监听状态) | |
accept(返回和客户端连接的实例) | |
read/write(读写) | read/write(读写) |
close(关闭资源) | close(关闭资源) |
package Internet; import java.io.*; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { //创建一个服务器端口实例 ServerSocket serverSocket=new ServerSocket(); //绑定端口 serverSocket.bind(new InetSocketAddress(8888)); //监听并获得socket实例,该方法会阻塞 Socket socket=serverSocket.accept(); System.out.println(socket.getRemoteSocketAddress()+" 客户端连接上"); //字符缓冲读取流,用来接收客户端消息 BufferedReader buffer=new BufferedReader(new InputStreamReader(socket.getInputStream())); //输出流,用来向客户端发送 OutputStream outputStream=socket.getOutputStream(); while(true){ String s=null; while((s=buffer.readLine())!=null){ //因为服务器端调用的是readLine,他看到换行符才会读取结束。 System.out.println("客户端信息________ " +s); //将接收到的消息返回给客户端 outputStream.write((s+"\n").getBytes()); outputStream.flush(); } } //关闭资源:后开的先关,因为异常抛出,所以下面几个方法报错 //outputStream.close(); //buffer.close(); //socket.close(); //serverSocket.close(); } }
package Internet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.Scanner; public class TCPClient { public static void main(String[] args) throws IOException { //ipconfig dos命令 查找本机ip //创建Socket实例 Socket socket=new Socket(); //连接服务器 socket.connect(new InetSocketAddress("127.0.0.1",8888)); Scanner scanner=new Scanner(System.in); //得到输出流实例 OutputStream outputStream=socket.getOutputStream(); //得到输入流实例 BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ String s=scanner.nextLine();//读取标准输入 outputStream.write((s+"\n").getBytes()); //向服务器发送消息 outputStream.flush(); String s1=reader.readLine(); //读取服务器返回的消息 System.out.println("服务器返回消息---》"+s1); if(s.equals(s1)){ //比对服务器返回的消息 System.out.println("服务端成功接收"); continue; } System.out.println("数据丢失请重新发送"); } //关闭资源 // outputStream.close(); // reader.close(); // socket.close(); } }