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

被折叠的 条评论
为什么被折叠?



