黑马程序员—Java基础—网络编程
来源:互联网 发布:ff14人女捏脸数据 编辑:程序博客网 时间:2024/06/16 20:57
-----------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行 JavaRaw
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行 JavaRaw
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行 JavaRaw
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行 JavaRaw
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学习型技术博客、期待与您交流!------------
- 黑马程序员——Java基础---网络编程(UDP编程)
- 黑马程序员——Java基础---网络编程(TCP编程)
- 黑马程序员——java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——Java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——Java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——java基础——网络编程
- 黑马程序员——JAVA基础——网络编程
- 黑马程序员——Java基础——网络编程
- 黑马程序员——Java基础——网络编程
- 黑马程序员——JAVA基础——网络编程
- 黑马程序员——Java基础—网络编程
- 黑马程序员——java基础—网络编程
- 黑马程序员——Java网络编程基础
- 类的继承
- grep与正则表达式
- 机器学习笔记_ 决策树
- 多态
- 抽象工厂模式,工厂方法模式区别
- 黑马程序员—Java基础—网络编程
- 初始化块
- Android Magnet:桌面删除APP自动弹出垃圾桶接受图标删除动作
- ubuntu 安装配置samba服务器
- 装饰者模式
- final修饰符
- Java中的多态(polymorphism)和动态绑定(dynamic binding)
- Alpha、Beta、RC、GA版本的区别
- 程序员技术练级攻略