黑马程序员-第二十四天(网络编程)

本文介绍了网络编程的基本概念,包括IP地址、端口、协议等基础知识,对比了UDP与TCP的特点及应用场景,并详细讲解了如何使用Java进行UDP和TCP编程。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

                             第二十三天(网络编程)
一,网络通讯要素
IP地址(网络中设备的标识):
一共有四 段组成,每一段就是一个字节最大就是255(8个1)
本地回环地址(如果没有配置本机Ip地址):127.0.0.1  主机名:localhost
网络段:192.168.1.0
网络段中的广播地址:192.168.1.255
端口:
数据要发送到对方指定的应用程序上,为了标识这此应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字叫做:端口(逻辑端口)                             
范围:0---65535,一般0---1024系统使用或保留端口

协议:定义通信规则,这个通讯规则称为协议 国际组织定义了通用协议:TCP/IP协议 UDP协议

二。网络模型


1,OSI参考模型
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
2,TCP/IP参考模型
应用层(Http,Ftp),传输层(TCP UDP),网际层(IP),主机到网络层

三,常用类和方法
1,InetAddress类(没有构造函数)
方法:
static InetAddress getLocalHost():返回本机IP地址对象
static InetAddress getByName(String host):返回指定的主机对象 参数可是ip地址,也可以是主机名 抛异常UnknownHostException
static InetAddress getAllByName(String host):返回指定主机的数组  抛异常UnknownHostException
static InetAddress getByAddress(byte[] buf):根据ip地址返回此对应的主机对象 抛异常UnknownHostException
String getHostAddress();获取主机的地址(ip)
String getHostName();获取主机的名称。当此ip地址没有在网络上注册时返回的主机名还是ip地址

2,TCP和UDP
UDP:面向无链接  如:聊天,网络视频会议,桌面共享,步话机,对讲机
·将数据及源和目的封装成数据包中,不需要建立连接
·每个数据报的大小在限制在64k内(超出后分包)
·因无连接,是不可靠协议
·不需要建立连接,速度快

TCP:面向连接  如:下载,打电话
·建立连接,形成传输数据的通道
·在连接中进行大数据量传输
·通过三次握手完成连接,是可靠协议
·必须建立连接,效率会稍低。

四,UDP:

3,Socket(插座的意思)
·Socket就是为网络服务提供的一种机制
·通信的两端都有Socket
·网络通信其实就是Socket间通信
·数据在两个Socket间通过IO传输

4,udp使用来DatagramSocket类来完成数据包(DatagramPacket)传输
DatagramSocket类此类表示用来发送和接收数据报包的套接字。 
构造方法:
常用方法:
public void send(DatagramPacket p)   throws IOException   发送数据包
public void receive(DatagramPacket p)  throws IOException  接收数据包
DatagramPacket类此类表示数据报包。
构造方法:(有接收和发送)
发送:
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
         接收:
          DatagramPacket(byte[] buf, int length)   构造 DatagramPacket,用来接收长度为 length 的数据包。
         
    udp发送端思路:
    1,建立udpSocket服务
    2,提供数据,并将数据封装到数据包中
    3,通过Socket服务的发送功能,将数据包发出去
    4,关闭资源
   
    代码体现:
    1,创建udp服务,通过DatagramSocket对象
    DatagramSocket ds  = new DatagramSocket();
    2,确定数据,并封装成数据包
    byte[] date = "udp is coming".getBytes();
    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000),会抛UnknownHostException
    3,通过Socket服务,将已有的数据包发送出去,通过send方法
    ds.send(dp);
    4,关闭资源
    ds.close();
   
    udp接收端的思路:
    1,定义udp Socket服务端
    2,定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
    3,通过socket服务的receive方法将收到的数据存入已经定义好的数据包中
    4,通过数据包对象的特有功能,将这此不同的数据取出
    5,关闭资源
   
    代码体现:
    1,创建udp scoket 建立端点,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识,方便明确哪些数据过来该应用程序可以处理
    DatagramSocket ds  = new DatagramSocket();
    2,定义数据包,用于存储数据
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf,buf.length);
    3,通过服务的receive方法将接收到的数据包存储到数据包中
    ds.receive(dp);
    4,通过数据包的方法获取其中的数据
    String ip = dp.getAddress().getHostAddress();
    String data = new String(da.getData(),0,dp.getLength());
    int port = dp.getPort();
    5,关闭资源
    ds.close();
   
    receive()方法是一个阻塞式方法。。端口使用后不会立刻释放的
   
五,TCP
1,tcp 传输分客户端和服务端,客户端对应的对象是Socket,服务端对应对象是ServerSocket
2,客户端:
通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机,因为tcp是面向连接的,并连接成功,形成通路后,在该通路下进行数据的传输

3,步骤:
1,创建Socket服务,并指定要连接的主机和端口
Socket s  = new Socket(InetAddress,port);
也可以建立一个空参数的socket服务,,然后调用connect(SocketAddress endpoint) 将此套接字连接到服务器。
其中SocketAddress是的一个抽象类可以使用其子类InetSocketAddress此类实现 IP 套接字地址(IP 地址 + 端口号)。
它还可以是一个对(主机名 + 端口号),在此情况下,将尝试解析主机名。
2,为了发送数据 ,应该获取socket流中的输出 流
OutputStream out = s.getOutputStream();
out.write(byte[]);
3,关闭资源
s.close();

2,服务端
1.建立服务端socket服务,ServerSocket()并监听一个端口
ServerSocket ss = new ServerSocket(1000)
ServerSocket(int port, int backlog) 监听一个端口并指定最大连接数
2,获取连接过来的客户端对象通过ServerSocket的accept方法,没有连接就会等,所以个方法是阻塞式的,
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();//获取ip地址

3,客户端如果发来数据,那么服务端要使用对应的客户端对象,并获取到该 客户端对象的读取流读取发过来的数据
InputStream in = s.getInputStream();
byte[] buf= new byte[1024]
int len = in.read(buf);
4,关闭服务端(可选)。关闭客户端

3,上传时要注意:定义一个结束标志可以自己定义时间戳,也可以使用shutdownOutput()  和 shutdownInput()方法来结束

4,服务端的并发登陆要使用多线程来完成 。 根据循环后的结束来判断,,定义标记


六,自定义浏览器(一定要注意加空行)

1,浏览器会向服务器提交一个http请求消息头(如下):
GET / HTTP/1.1   GET是一种请求方法POST也是一种请求方式   后面是路径 空格 HTTP/1.1  http的版本
Host: localhost:10022  明确主机,端口
Connection: keep-alive  连接状态(close)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8  支持的格式
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/32.0.1700.107 Safari/537.36  用户信息
Accept-Encoding: gzip,deflate,sdch 支持的数据封装形式 提高传输效率。 
Accept-Language: zh-CN,zh;q=0.8   支持的语言

请求数据头和请求数据体必须用空行隔开进行区分。

2,http应答消息头

HTTP/1.1 200 OK  支持版本  200 响应代码 响应成功
Server: Apache-Coyote/1.1 服务器版本
Accept-Ranges: bytes
ETag: W/"182-1395197359758"  标记
Last-Modified: Wed, 19 Mar 2014 02:49:19 GMT 最后一次修改时间
Content-Type: text/html  数据类型
Content-Length: 182  数据的大小  字节
Date: Wed, 19 Mar 2014 03:36:27 GMT
Connection: close


七,URL类(将url封装成的对象)

1,类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,
也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
URI(表示一个统一资源标识符 (URI) 引用。 )的范围要比URL的范围大
2,
构造函数:
URL(String spec)   根据 String 表示形式创建 URL 对象。
URL(String protocol, String host, int port, String file)   根据指定 protocol、host、port 号和 file 创建 URL 对象。

方法
public String getFile()获取此 URL 的文件名。此 URL 的文件名,如果没有文件名,则返回一个空字符串==getPath()+getQuery()
public String getHost()获取此 URL 的主机名
public String getPath()获取此 URL 的路径部分。 返回:此 URL 的路径部分,如果没有路径,则返回一个空字符串
public int getPort()获取此 URL 的端口号。 返回:端口号,如果未设置端口号,则返回 -1,
public String getProtocol()获取此 URL 的协议名称。 
public String getQuery()获取此 URL 的查询部分。 返回:此 URL 的查询,如果没有查询,则返回 null

public URLConnection openConnection()   throws IOException返回一个 URLConnection 对象,只要调用此方法url就会自动远程连接这台主机,获取连接对象
不用写socket服务了
public final InputStream openStream()     throws IOException
打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。此方法是下面方法的缩写:  openConnection().getInputStream()



如果getPort 返回-1时,我会给其设置一个默认端口号

八,URLConnection(抽象类)应用层  不会关闭


1,子类
HttpURLConnection
JarURLConnection

2,方法:
URLConnection(URL url)        构造一个到指定 URL 的 URL 连接。
InputStream  getInputStream();返回读取流
OutputStream getOutputStream()返回写入流

九。域名解析


1,想要将主机名翻译成ip地址,需要域名解析DNS
2,配置DNS服务器:
不配置会走默认的DNS服务器 电信的宽带可以配置成联通的dns服务器,,选择近的dns服务器进行配置
会请求超时
3,其实127.0.0.1和localhost的映射关系就在本机上。
c:\windows\systems\drivers\ext\host文件中

在文件中可以进行ip地址设置
可以提高访问速度
可以屏蔽网站(软件注册时会先找这个文件,如果没有找到才会去找dns)


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值