------- android培训、java培训、期待与您交流! ----------
java网络编程初步
1.认识ip地址
互联网上的每一台计算机都有一个唯一标示自己的标记,这个标记就是ip地址,ip地址使用32位长度二进制数据表示,在实际中看到的大部分ip地址都是以十进制数据表示的
ip地址分为五类
第一类:1.0.0.1----126.255.255.254 //该类保留给政府机构等有关部门
第二类:128.0.0.1--191.255.255.254 //该类分配给中等规模的公司
第三类:192.0.0.1--233.255.255.254 //该类分配给任何需要的人
第四类:224.0.0.1--239.255.255.254 //该类用于组播
第五类:240.0.0.1--255.255.255.254 //该类用于各种实验
以上地址没有127.x.x.x,其是保留地址,用作循环测试,127.0.0.1表示本机ip地址
ip地址又分为ipv4和ipv6两类,ipv4是互联网协议的第4个版本,也是使用最广泛的版本,ipv6相当于ipv4能容纳更多的主机数量
InetAddress 类主要用于表示ip地址他有两个子类, Inet4Address 和 Inet6Address 分别表示ipv4和ipv6
该类没有构造方法但是可以通过踏他的静态方法得到 InetAddress 对象
public static InetAddress[] getAllByName(String host)throws UnknownHostException //在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
public static InetAddress getByAddress(byte[] addr)throws UnknownHostException //在给定原始 IP 地址的情况下,返回 InetAddress 对象
public static InetAddress getByAddress(String host, byte[] addr)throws UnknownHostException //根据提供的主机名和 IP 地址创建 InetAddress
public static InetAddress getByName(String host)throws UnknownHostException //在给定主机名的情况下确定主机的 IP 地址。
public static InetAddress getLocalHost()throws UnknownHostException //返回本地主机。
实例1
import java.net.*;
public class TestInetAddress {
public static void main(String[] args) throws Exception{ //抛出所有异常
InetAddress ia = InetAddress.getLocalHost(); //拿到本的InetAddress对象
System.out.println(ia.isReachable(5000));
System.out.println(ia.getHostAddress() + ia.getHostName());
InetAddress[] ia2 = InetAddress.getAllByName("www.baidu.com");//拿到百度的主机的InetAddress对象
for(InetAddress i: ia2) {
System.out.println(i.getHostAddress() + i.getHostName());
System.out.println(i.isReachable(5000)); //测试是否可以达到该地址,超时时间为5000毫秒
}
}
}
2认识网络模型
请看下面一张图
我们后面所要学到的UDP和TCP就是在这层混的,IP就是在网际层混的,而诸如http,ftp协议就是在应用层混的
3.UDP简介
1.将数据及源和目的封装在数据包中,无需建立连接
2.每个数据包的大小限制在64k内
3.因无连接,所以是不可靠协议
4.无需建立连接,速度快
实例2
/*
*定义发送端,键盘录入数据,并将其发送到接收端
*
*/
import java.net.*;
import java.io.*;
public class TestUDPSend {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(2223); //创建数据报套接字并将其绑定到本地主机上的2223端口
//byte[] b = "ababdashdasd".getBytes();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //使用键盘录入数据
String str = null;
while((str = br.readLine()) != null) {
if(str.equals("over")) {
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(), 8888);//构造数据报包对象的包发送到本地主机上的8888端口号
ds.send(dp); //发送数据
break;
}
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getLocalHost(), 8888);
ds.send(dp);
}
ds.close();
}
}
/*
*定义接收端,读取数据,如果数据是over就关闭服务端
*
*/
实例3
import java.net.*;
public class TestUDPReceive {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888); //创建数据报套接字,将其绑定到指定的本地端口8888
boolean flag = true;
while(flag) {
byte[] b = new byte[1024]; //创建字节缓冲数组
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
if(new String(dp.getData(), 0, dp.getLength()).equals("over")) { //判断数据是否是over,是就跳出循环
break;
}
System.out.println(new String(dp.getData(), 0, dp.getLength()) + dp.getSocketAddress());
}
ds.close();
//System.out.println("close");
}
}
1.需要建立连接,形成传输数据的通道
2.在连接中进行大量数据传输
3.通过三次握手形成连接,较为可靠
4.必须建立连接,速度慢,效率低
ServerSocket 和 Socket
在 Socket 程序开发中,服务器端使用 ServerSocket 等待客户端的连接,对于java网络程序来讲每一个客户端都使用 Socket 对象来表示
TCP的典型案例Echo程序,一个回应程序,客户输入什么内容,服务器端就会在在这些内容前家Echo,并将其返回给客户端
实例4
import java.net.*;
import java.io.*;
public class TestEchoServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket();
ss.bind(new InetSocketAddress(InetAddress.getLocalHost(), 8888)); //此服务器在8888端口上监听
boolean f = true; //定义一个标志位
while(f) { //用while循环无限接受客户端连接
Socket s = ss.accept(); //接收客户端连接
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream pw = new PrintStream(s.getOutputStream()); //拿到输出流
boolean flag = true;
while(flag) {
String str = br.readLine(); ///不断的接收信息
if(str.equals("") || str == null) {
flag = false;
} else {
if(str.equals("over")) { //判断客户端是否结束
break;
} else {
StringBuilder sb = new StringBuilder(str);
sb.insert(0, new String("Echo"));
System.out.println(sb);
pw.println(new String(sb)); //将新的数据返回客户端
pw.flush();
}
}
}
br.close(); //关闭输入流
pw.close(); //关闭输出流
s.close(); //关闭客户端
}
ss.close(); //关闭服务器
}
}
import java.io.*;
import java.net.*;
public class TestEchoClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket(InetAddress.getLocalHost(), 8888); //指定连接主机和端口
PrintStream pw = new PrintStream(s.getOutputStream()); //拿到输出流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //从键盘读取数据
BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream())); //接收服务器的输出信息
String line = null;
while((line = br.readLine()) != null) {
if(line.equals("over") || line.equals("")) { //判断是否断开服务器
break;
}
pw.println(line); //发送数据
pw.flush();
System.out.println(br2.readLine());
}
pw.close(); //关闭输出流
br.close(); //关闭键盘录入流
br2.close(); //关闭输入流,
s.close(); //关闭客户端
}
5.URL 与 URL Connection
URL(Uniform Resource Locator)统一资源定位符,可以直接使用此类找到互联网上的资源
实例5
import java.io.*;
import java.net.*;
public class TestURL {
public static void main(String[] args) throws Exception {
String url1 = "http://www.hao123.com:890/web/index.jsp?tn=12092018_15_hao_pg";
String url2 = "http://www.baidu.com";
URL myurl1 = new URL(url1);
URL myurl2 = new URL(url2);
System.out.println(myurl1.getHost()); //显示主机名称
System.out.println(myurl1.getPort()); //显示主机端口
System.out.println(myurl1.getPath()); //显示文件路路径
System.out.println(myurl1.getProtocol()); //显示协议
System.out.println(myurl1.getFile()); //显示文件名
System.out.println(myurl1.getQuery()); //显示查询部分
URLConnection urlc = myurl2.openConnection(); //返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
System.out.println(urlc.getContentLength()); //返回 content-length 头字段的值。
System.out.println(urlc.getContentType()); //返回 content-type 头字段的值。
System.out.println("---------------------");
System.out.println(urlc.getContentEncoding()); //返回 content-encoding 头字段的值。
System.out.println(urlc);
InputStream i = urlc.getInputStream(); //返回从此打开的连接读取的输入流
byte[] b = new byte[1024*1024*2];
int leng = i.read(b);
System.out.println(new String(b, 0, leng));
}
6.URLEncoder 和 URLDecoder
在使用URL访问时,经常会在地址后面出现很多附带信息,在那上面英文可以显示,但是中文则会对其进行一些列的编码操作,在java中如果要完成这样的操作就必须使用URLEncoder 和
URLDecoder
实例6
import java.net.*;
public class TestEncoderandDecoder {
public static void main(String[] args) throws Exception {
String str = "黑马我来了haha";
String encod = URLEncoder.encode(str, "utf-8"); //用utf-8进行编码
System.out.println("编码后 :" + encod);
String decod = URLDecoder.decode(str, "utf-8"); //用utf-8进行解码
System.out.println("解码后 :" + decod);
}
}