黑马程序员—Java基础—网络编程

            -----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

网络模型

计算机网络之间以何种规则进行通信,就是网络模型研究问题。

网络模型一般是指

        OSI(Open SystemInterconnection开放系统互连)参考模型

         TCP/IP参考模型



网络模型7层概述:

1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

3. 网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。

4. 传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)

6.表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等)。

7.应用层: 主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)。

网络通信三要素

IP地址:InetAddress

                  网络中设备的标识,不易记忆,可用主机名

端口号

                  用于标识进程的逻辑地址,不同进程的标识

传输协议

                  通讯的规则

                  常见协议:TCP,UDP

InetAddress类的使用

没有构造方法,那么如何使类提供的功能呢?

要掌握的功能

                   获取任意主机:getByName

                  

                   主机名:getHostName

                   主机Ip地址:getHostAddress

协议UDP和TCP的简介及区别

UDP

           将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

TCP

            建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

Socket机制图解

UDP传输

DatagramSocket与DatagramPacket

建立发送端,接收端。

建立数据包。

调用Socket的发送接收方法。

关闭Socket。

发送端与接收端是两个独立的运行程序。

UDP传输-发送端思路

  UDP发送端思想及代码  38行  Java
Raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
         
         
/*
* 1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源

*/
public class UdpDemo {
public static void main ( String [] args ) throws IOException {
//建立udp的socket服务
DatagramSocket ds = new DatagramSocket ();
while ( true ){
Scanner sc = new Scanner ( System . in );
String line = sc . nextLine ();
if ( line . equals ( "886" )){
break ;
}
//将要发送的数据封装成数据包
byte [] by = line . getBytes ();
int len = by . length ;
InetAddress address = InetAddress . getByName ( "郭敬杰" );
int port = 10086 ;
DatagramPacket dp = new DatagramPacket ( by , len , address , port );
//通过udp的socket服务,将数据包发送出
//public void send(DatagramPacket p)
// throws IOException从此套接字发送数据报包。
//DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。
ds . send ( dp );
}
//关闭资源
ds . close ();
}
}

UDP传输-接收端思路

  UDP接收端思想及代码  37行  Java
Raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
         
         
import java.io.IOException ;
import java.net.DatagramPacket ;
import java.net.DatagramSocket ;
import java.net.InetAddress ;

/*
* 1:建立udp的socket服务.
2:通过receive方法接收数据
3:将收到的数据存储到数据包对象中
4:通过数据包对象的功能来完成对接收到数据进行解析.
5:可以对资源进行关闭
*/
public class UdpReciveDemo {
public static void main ( String [] args ) throws IOException {
//1:建立udp的socket服务.
DatagramSocket ds = new DatagramSocket ( 10086 );
while ( true ){
//2:通过receive方法接收数据
byte [] by = new byte [ 2048 ];
DatagramPacket dp = new DatagramPacket ( by , by . length );
//3:将收到的数据存储到数据包对象中
ds . receive ( dp );
//4:通过数据包对象的功能来完成对接收到数据进行解析.
String address = dp . getAddress (). getHostAddress ();
int port = dp . getPort ();
//System.out.println(address);
byte [] buf = dp . getData ();
String string = new String ( buf , 0 , dp . getLength ());
System . out . println ( "From:" + address + "--" + port + "is:" + string );
}
//5:可以对资源进行关闭
//ds.close();
}
}

TCP传输

Socket和ServerSocket

建立客户端和服务器端

建立连接后,通过Socket中的IO流进行数据的传输

关闭socket

客户端与服务器端是两个独立的应用程序。

TCP传输-客户端

  TCP客户端思想及代码  27行  Java
Raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
         
         
import java.io.IOException ;
import java.io.OutputStream ;
import java.net.Socket ;
import java.net.UnknownHostException ;
import java.util.Scanner ;

/*
* 1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源

*/
public class SendDemo {
public static void main ( String [] args ) throws UnknownHostException , IOException {
//Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket s = new Socket ( "192.168.0.101" , 8888 );
//2:public OutputStream getOutputStream()throws IOException返回此套接字的输出流
OutputStream os = s . getOutputStream ();
Scanner sc = new Scanner ( System . in );
String line = sc . nextLine ();
os . write ( line . getBytes ());
s . close ();
}
}

TCP传输-服务器端

  TCP服务器端思想及代码  28行  Java
Raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
         
         
import java.io.IOException ;
import java.io.InputStream ;
import java.net.InetAddress ;
import java.net.ServerSocket ;
import java.net.Socket ;

/*
* 1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的

*/
public class ReciveDemo {
public static void main ( String [] args ) throws IOException {
ServerSocket ss = new ServerSocket ( 8888 );
Socket s = ss . accept ();
String address = s . getInetAddress (). getHostAddress ();
System . out . println ( address + "\t" + "is connected" );
InputStream is = s . getInputStream ();
byte [] by = new byte [ 1024 ];
int len = is . read ( by );
String str = new String ( by , 0 , len );
System . out . println ( str );
s . close ();
//ss.close();
}
}

TCP传输容易出现的问题

客户端连接上服务端,两端都在等待,没有任何数据传输。

通过例程分析:

                   因为read方法或者readLine方法是阻塞式。

解决办法:

         自定义结束标记

         使用shutdownInput,shutdownOutput方法。


-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值