黑马程序员————JAVA之网络编程

------- http://www.itheima.com" target="blank">android培训http://www.itheima.com"target="blank">java培训、期待与您交流!
 
一、概述
1. 网络编程三要素:IP:计算机在互联网上的唯一的地址;端口;协议:
2. IP概念:
   所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
    按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。
    例如一个采用二进制形式的IP地址是"11000000101010000000000101100100",这么长的地址,人们处理起来也太费劲了。
    为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号"."分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做"点分十进制表示法",这显然比1和0容易记忆得多。
    最小IP:00000000.00000000.00000000.00000000	:十进制:0.0.0.0
    最大IP:11111111.11111111.11111111.11111111	:十进制:255.255.255.255
3. IP地址的组成
    P地址 = 网络号码+主机地址
    A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
    B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
    C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
4. 局域网内的电脑在什么情况下可以互相访问:在同一网段;
   怎么来区分同一网段:
   "子网掩码":
   例如:有如下IP:
	1).192.168.1.10
        2).192.168.1.20
	3).192.168.2.30
			
	1.子网掩码:为:255.255.255.0(二进制:11111111.11111111.11111111.00000000)
		注意:子网掩码中全部表示为1的作为"网络号码")
		1和2可以互访;
	2.子网掩码:255.255.0.0(二进制:11111111.11111111.00000000.00000000)
		1和2和3都可以互访;	
		特殊地址:
			127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1   
			DOS命令 ipconfig:查看本机IP地址
		xxx.xxx.xxx.0 网络地址
		xxx.xxx.xxx.255 广播地址
		A类	1.0.0.1---127.255.255.254	
    (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址
    (2)127.X.X.X是保留地址,用做循环测试用的。
		B类	128.0.0.1---191.255.255.254	172.16.0.0---172.31.255.255是私有地址。 169.254.X.X是保留地址。
		C类	192.0.0.1---223.255.255.254	192.168.X.X是私有地址
		D类	224.0.0.1---239.255.255.254 	
		E类	240.0.0.1---247.255.255.254	
5. 端口:
	1).物理端口:网卡口;
	2).逻辑端口:由操作系统管理的,在一个"物理端口"的情况下,为了能同时运行多个"网络应用程序",这时操作系统提供了"逻辑端口";
	A.我们讲的"端口"就是"逻辑端口";
	B.逻辑端口的范围:0--65535;
	C.一个应用程序可以同时占用多个端口;
	D.一个端口,在某一时刻,只能由一个应用程序占用;
    E.0--1024:是由操作系统使用的,我们最好不要用;
6. 协议:
	1).TCP,UDP,FTP,HTTP.......
	2).UDP协议:
	   1.面向无连接:类似于"广播","有线电视"
	   2.数据需要打包发送;
	   3.数据大小有限制:64K以内;
	   4.因为无连接,所以属于不可靠的协议,但速度快;
	3).TCP协议:
		1.面向连接:类似于"打电话"
		2.可以进行大量数据的传输;
		3.由于需要连接,建立连接就要双方确认,所有速度慢;
二、通过代码演示讲解部分功能:
 
 1.InetAddress类的部分获取功能:
   
package com.isdf;

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 * java.net.InetAddress(类):此类表示互联网协议(IP)地址。
 * 获取任意主机:getByName(静态方法)
 * 机名:getHostName
 * 主机IP地址:getHostAddress
 */

public class Demo_获取计算机IP {
	public static void main(String[] args) {
		InetAddress address;
		try {
			address = InetAddress.getByName("WIN-DEFRH7SB8J9");
			String hostName = address.getHostName();
			String ip = address.getHostAddress();
			System.out.println("计算机名"+hostName+"IP"+ip);

		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 2.关于网络发送信息与接收信息的小案例
  
 
 
  
package com.idj_TCPz;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Send {
	public static void main(String[] args) throws IOException {
		// 实例化一个Socket对象
		Socket sc = new Socket("192.168.30.156", 8888);
		// 通过Socket接收一个输出流
		OutputStream out = sc.getOutputStream();
		// 发送数据
		out.write("你好,呵呵".getBytes());
		// 释放资源
		out.close();
		sc.close();

	}

}
 
 
 
 
package com.idj_TCPz;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Receve {
	public static void main(String[] args) throws IOException {
		// 实例化一个ServerSocket
		ServerSocket sever = new ServerSocket(8888);
		// 等待连接
		System.out.println("等待接收数据");
		Socket socket = sever.accept();
		// 获取输入流
		InputStream in = socket.getInputStream();
		// 读取信息
		byte[] byteArray = new byte[1024];
		int len = in.read(byteArray);
		String s = new String(byteArray, 0, len);
		System.out.println("接收到信息:" + s);
		// 释放资源
		in.close();
		sever.close();
		socket.close();
	}

}
 
3.UDP协议发送数据:
  
package com.idj_UDP发送数据;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDP协议发送数据:
 * 
 * 1.实例化一个:DatagramSocket对象;
 * 2.准备数据:
 * 		1).目标机器的IP:InetAddress对象;
 * 		2).目标机器的端口号;
 * 		3).信息内容:byte[]数组
 * 3.准备数据包:DatagramPacket对象;需要封装:IP、端口、信息内容;
 * 4.发送数据:DatagramSocket对象的send(DatagramPacket p)方法,
 */
public class Send {
	public static void main(String[] args) throws IOException {
		//实例化一个:DatagramSocket对象;
		DatagramSocket socket = new DatagramSocket();
		//准备数据
		InetAddress add = InetAddress.getByName("");
		int port = 255;
		byte[] byteArray = "哈哈,小逗比,在睡觉吗?".getBytes();
		//准备数据包
		DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length,add,port);
		//发送数据
		socket.send(pck);
		//释放资源
		socket.close();
		System.out.println("信息已发出!");

	}

}

  
package com.idj_UDP发送数据;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * UDP的接收端:
 * 1.构造一个DatagramSocket(端口号)
 * 2.准备一个空的byte[]数组,准备接收数据;
 * 3.准备一个空的数据包,DatagramPacket,用来接收数据;
 * 4.等待数据的到来,DatagramPacket的receive(DatagramPacket)
 * 	 如果数据到达,那么receive()方法将返回,并将数据封装到数据包对象中;
 * 5.从数据包中读取数据
 */
public class Receive {
	public static void main(String[] args) throws IOException {
		//构造一个DatagramSocket(端口号)
		DatagramSocket socket = new DatagramSocket(255);
		//准备一个空的byte[]数组,准备接收数据;
		byte[] byteArray = new byte[1024];
		//准备一个空的数据包,DatagramPacket,用来接收数据;
		DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);
		//等待数据到达
		System.out.println("正在等待信息到达。。。");
		socket.receive(pck);//程序在此会阻塞
		System.out.println("有信息到达");
		//获取数据
		byte[] byteInfo = pck.getData();
		String str = new String(byteInfo,0,pck.getLength());
		String ip = pck.getAddress().getHostAddress();
		System.out.println("接收到信息:IP:"+ip+"内容"+str);
		
		
		socket.close();

	}

}

 
 4.服务器端收发数据案例:
 
  
package com.idj_服务器端收发数据;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws IOException{
		//实例化一个Socket
		Socket socket = new Socket("192.168.30.145",9900);
		//通过Socket获取一个输出流
		OutputStream out = socket.getOutputStream();
		//发送数据
		out.write("呵呵,来喽!加油!".getBytes());
		//等待反馈--获取一个输入流
		InputStream in = socket.getInputStream();
		//接收数据
		byte[] byteArray = new byte[1024];
		int len = in.read(byteArray);
		String str = new String(byteArray,0,len);
		System.out.println("发送端接收到反馈:"+str);
		
		//释放资源
		in.close();
		out.close();
		socket.close();
		System.out.println("客户端结束!");

	}

}

 
  <pre class="java" name="code">package com.idj_服务器端收发数据;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws IOException {
		//实例化一个ServerSocket
		ServerSocket sever = new ServerSocket(9900);
		//等待连接
		Socket socket = sever.accept();
		//获取输入流
		InputStream in = socket.getInputStream();
		//定义一个字节数组
		byte[] byteArray = new byte[1024];
		int len = in.read(byteArray);

	}

}


package com.idj_UDP发送数据;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
 * UDP的接收端:
 * 1.构造一个DatagramSocket(端口号)
 * 2.准备一个空的byte[]数组,准备接收数据;
 * 3.准备一个空的数据包,DatagramPacket,用来接收数据;
 * 4.等待数据的到来,DatagramPacket的receive(DatagramPacket)
 * 	 如果数据到达,那么receive()方法将返回,并将数据封装到数据包对象中;
 * 5.从数据包中读取数据
 */
public class Receive {
	public static void main(String[] args) throws IOException {
		//构造一个DatagramSocket(端口号)
		DatagramSocket socket = new DatagramSocket(255);
		//准备一个空的byte[]数组,准备接收数据;
		byte[] byteArray = new byte[1024];
		//准备一个空的数据包,DatagramPacket,用来接收数据;
		DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);
		//等待数据到达
		System.out.println("正在等待信息到达。。。");
		socket.receive(pck);//程序在此会阻塞
		System.out.println("有信息到达");
		//获取数据
		byte[] byteInfo = pck.getData();
		String str = new String(byteInfo,0,pck.getLength());
		String ip = pck.getAddress().getHostAddress();
		System.out.println("接收到信息:IP:"+ip+"内容"+str);
		
		
		socket.close();

	}

}


 

 

 


 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值