黑马程序员-java网络编程

------- 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");
	}
}


4.TCP简介
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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值