------- android培训、java培训、期待与您交流! ----------
网络参考模型
网络通讯要素
1,P地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
2,端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口。
3,传输协议
通讯的规则
常见协议:TCP,UDP
UDP
1,将数据及源和目的封装成数据包中,不需要建立连接
2,每个数据报的大小在限制在64k内
3,因无连接,是不可靠协议
4,不需要建立连接,速度快
TCP
1,建立连接,形成传输数据的通道。
2,在连接中进行大数据量传输
3,通过三次握手完成连接,是可靠协议
4,必须建立连接,效率会稍低
Socket
Socket就是为网络服务提供的一种机制。
1,通信的两端都有Socket。
2,网络通信其实就是Socket间的通信。
3,数据在两个Socket间通过IO传输。
UDP传输
1,DatagramSocket与DatagramPacket
2,建立发送端,接收端。
3,建立数据包。
4,调用Socket的发送接收方法。
5,关闭Socket。
发送端与接收端是两个独立的运行程序。
发送端:
public static void main(String[] args) throws Exception
{
//1,创建udp服务,通过DategrameSocket对象
DatagramSocket ds = new DatagramSocket();
//2,确定数据,将数据封装成数据包
byte[] buf = "我给你发点数据".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000);
//3,通过socket服务,将已有的数据包发送出去
ds.send(dp);
//关闭资源
ds.close();
}
接收端:
public static void main(String[] args) throws Exception
{
//1,创建udpsocket,建立端点
DatagramSocket ds = new DatagramSocket(10000);
//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(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5,关闭资源
ds.close();
}
TCP传输
1,Socket和ServerSocket
2,建立客户端和服务器端
3,建立连接后,通过Socket中的IO流进行数据的传输
4,关闭socket
同样,客户端与服务器端是两个独立的应用程序。
客户端:
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务,指定目的主机和端口
Socket s = new Socket("192.168.1.100",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("Tcp协议 发点数据".getBytes());
//关闭资源
s.close();
}
服务端:
public static void main(String[] args)throws Exception
{
//建立服务端socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的的客户端对象
while (true)
{
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端
ss.close();//关闭服务端
}
}
Tcp传输最容易出现的问题
1,客户端连接上服务端,两端都在等待,没有任何数据传输。
2,通过例程分析:
因为read方法或者readLine方法是阻塞式。
3,解决办法:
自定义结束标记
使用shutdownInput,shutdownOutput方法。
练习1:建立一个文本转换服务器。
练习2:上传图片
练习3:限制用户登录次数
URL
类 URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。
资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,
例如对数据库或搜索引擎的查询。
常见方法:
String getFile() 获取此 URL 的文件名。
String getHost() 获取此 URL 的主机名。
String getPath() 获取此 URL 的路径部分。
int getPort() 获取此 URL 的端口号。
String getProtocol() 获取此 URL 的协议名称。
String getQuery() 获取此 URL 的查询部