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