------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程
主要内容:《 三要素、InetAddress类、UDP的发送方、UDP的接收方、TCP的发送端、TCP的接收端、反馈案例、客户端键盘录入服务器控制台输出 》
1.网络编程三要素
网络编程三要素:
1.IP:寄信的"地址"
2.端口:相当于"收信人"。在计算机上,可以同时有多个程序接收网络数据,每个程序都会占用至少一个端口;
3.协议:双方要都能看得懂;
一.IP:IP地址是计算机在互联网上,唯一标示此计算机的地址;
1.所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,
就是4个字节。例如一个采用二进制形式的IP地址是:
"11000000101010000000000101100100",这么长的地址,
人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,
中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。
IP地址的这种表示法叫做"点分十进制表示法",这显然比1和0容易记忆得多。
192.168.0.1:(十进制):四段,每段的范围:0--255
11000000.10101000.00000000.00000001:(二进制)
内部使用二进制存储:
最小值:00000000.00000000.00000000.00000000:0.0.0.0
最大值:11111111.11111111.11111111.11111111:255.255.255.255(256 * 256 * 256 * 256)
2.B:IP地址的组成
IP地址 = 网络号码 + 主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码:192.0.0.1 -- 192.255.255.255(256 * 256 * 256)
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码:192.168.0.1 -- 192.168.255.255(256 * 256)
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码:192.168.0.1 -- 192.168.0.255(256)
作用:
例如以下三个IP:
1.192.168.0.1
2.192.168.0.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可以互访;
3.特殊地址:
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
ping:在"命令提示符"下,可以使用ping命令测试网络连接;
格式:
>ping 192.168.0.30(IP地址)
>ping www.baidu.com(域名)
4.DOS命令 ipconfig:查看本机IP地址
5. xxx.xxx.xxx.0 网络地址
xxx.xxx.xxx.255 广播地址
6.
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
二.端口:
1.物理端口:网卡口;
2.逻辑端口:由操作系统定义并维护。Windows下,逻辑端口的范围:0 -- 65535
我们讲的端口就是"逻辑端口":
3.每个网络应用程序都至少占用1个逻辑端口,也可以同时占用多个;
4.每个端口,同一时刻,只能被一个应用占用。
5.有效端口:0~65535,其中0~1024系统使用或保留端口。
三.协议:
1.网络传输协议:UDP,TCP,HTTP,FTP......
我们涉及到的:UDP协议,TCP协议:
2.UDP:
1).先将数据打包;
2).不需要连接;可以没有接收方,发送方直接发送即可;
3).由于不需要建立连接,不安全的,速度快;
4).发送的数据大小有限制:64K
类似于:广播、电视
3.TCP:
1).面向连接的;必须要有接收方;
2).安全,速度慢--连接时,需要双方发送握手信息;
类似于:打电话;
2.InetAddress类
InetAddress 类:此类表示互联网协议 (IP) 地址。
要掌握的功能
获取任意主机:InetAddress static getByName(String hostName):
主机名:getHostName():
主机Ip地址:getHostAddress()
1 public class Demo { 2 public static void main(String[] args) throws Exception { 3 InetAddress add = InetAddress.getByName("Lenovo-PC"); 4 5 //获取主机名 6 String hostName = add.getHostName(); 7 String ip = add.getHostAddress(); 8 System.out.println("计算机名:" + hostName + " IP : " + ip); 9 10 } 11 }
3.UDP的发送方
1.实例化一个Socket:DatagramSocket
2.准备数据:
1).目标IP;
2).目标端口;
3).信息内容;
3.封装数据报:DatagramPacket
4.调用DatagramSocket的send()方法,发送:数据报
1 public class Demo { 2 public static void main(String[] args) throws IOException { 3 // 1.实例化一个Socket:DatagramSocket 4 DatagramSocket sendSocket = new DatagramSocket(); 5 // 2.准备数据: 6 InetAddress ip = InetAddress.getByName("Lenovo-PC"); 7 int port = 8888; 8 byte[] byteArray = "你好,这里是通过UDP发送的数据,请接收.....".getBytes(); 9 // 3.封装数据报:DatagramPacket 10 DatagramPacket packet = new DatagramPacket(byteArray, 11 byteArray.length, 12 ip, port); 13 //4.发送数据 14 sendSocket.send(packet); 15 16 //5.释放资源 17 sendSocket.close(); 18 System.out.println("信息已发送!"); 19 20 } 21 }
4.UDP的接收方
1.建立Socket对象:DatagramSocket(监听端口)
2.建立一个空的byte[]数组,准备接收数据;
3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接;
4.调用DatagramSocket的receive()等待信息;
5.一旦有信息火来,receive()将会返回,并且将信息填充到数据报对象中;
6.通过数据报对象获取信息;
1 public class Demo { 2 public static void main(String[] args) throws IOException { 3 //1.建立Socket对象:DatagramSocket(监听端口) 4 DatagramSocket socket = new DatagramSocket(8888); 5 //2.建立一个空的byte[]数组,准备接收数据; 6 byte[] byteArray = new byte[1024]; 7 //3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接; 8 DatagramPacket packet = new DatagramPacket(byteArray,byteArray.length); 9 //4.调用DatagramSocket的receive()等待信息; 10 System.out.println("等待信息....."); 11 socket.receive(packet);//程序将在这里阻塞,等待信息,如果有信息来,此方法将返回,并将数据填充到packet中 12 System.out.println("有信息到达!"); 13 //6.通过数据报对象获取信息; 14 //IP地址: 15 String ip = packet.getAddress().getHostAddress(); 16 //信息: 17 byte[] infoArray = packet.getData();//获取信息内容 18 String str = new String(infoArray,0,packet.getLength()); 19 System.out.println("接收方接收到信息:IP:" + ip + " 内容:" + str); 20 21 //释放资源 22 socket.close(); 23 } 24 }
5.TCP的发送端
面向连接的,一定要有接收方存在
步骤:
1.实例化一个Socket:java.net.Socket
构造方法:Socket(String host, int port)
2.因为要发送,通过Socket对象获取一个输出流:
3.通过输出流输出信息;
4.释放资源;
1 public class Send { 2 public static void main(String[] args) throws IOException{ 3 //1.实例化一个Socket:java.net.Socket 4 Socket socket = new Socket("192.168.38.91",8888); 5 //2.因为要发送,通过Socket对象获取一个输出流: 6 OutputStream out = socket.getOutputStream(); 7 //3.一次输出一个字节数组 8 out.write("你好,这里是通过TCP发送的数据,你能收到吗?".getBytes()); 9 //4.释放资源 10 out.close(); 11 socket.close(); 12 } 13 }
6.TCP的接收端
1.实例化Socket : ServerSocket(监听的端口)
2.调用ServerSocket的accept()方法等待客户端连接;
3.一旦有客户端连接,accept()方法会返回一个Socket对象,
此Socket对象跟发送端的Socket对象是对应的;
4.由于要接收数据,从此Socket中获取一个输入流:
5.读取数据;
6.释放资源
1 public class Demo { 2 public static void main(String[] args) throws IOException{ 3 //1.实例化Socket : ServerSocket(监听的端口) 4 ServerSocket server = new ServerSocket(8888); 5 //2.调用ServerSocket的accept()方法等待客户端连接; 6 System.out.println("等待客户端连接......"); 7 Socket socket = server.accept(); 8 System.out.println("有客户端连接!"); 9 //3.获取输入流。因为要读取数据 10 InputStream in = socket.getInputStream(); 11 //4.一次读取一个字节数组 12 byte[] byteArray = new byte[1024]; 13 int len = in.read(byteArray); 14 String s = new String(byteArray,0,len); 15 System.out.println("服务端接收到数据:" + s); 16 //5.释放资源 17 in.close(); 18 server.close(); 19 } 20 }
7.服务器给客户端一个反馈案例
1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 /* 8 * 接收方: 9 * 10 * 一次接收:InputStream 11 * 一次发送:OutputStream 12 */ 13 public class Receive { 14 public static void main(String[] args) throws IOException { 15 ServerSocket server = new ServerSocket(8888); 16 //等待连接 17 Socket socket = server.accept(); 18 //获取输入流 19 InputStream in = socket.getInputStream(); 20 //一次读取一个字节数组 21 byte[] byteArray = new byte[1024]; 22 int len = in.read(byteArray); 23 String s = new String(byteArray,0,len); 24 System.out.println("接收端:接收到信息:" + s); 25 26 //发送反馈 27 //获取输出流 28 OutputStream out = socket.getOutputStream(); 29 //一次输出一个字节数组 30 out.write("收到".getBytes()); 31 32 //释放资源 33 out.close(); 34 in.close(); 35 server.close(); 36 37 38 } 39 } 40 41 import java.io.IOException; 42 import java.io.InputStream; 43 import java.io.OutputStream; 44 import java.net.Socket; 45 46 /* 47 服务器给客户端一个反馈案例 48 49 发送方: 50 51 先发送: OutputStream 52 后接收: InputStream 53 */ 54 public class Send { 55 public static void main(String[] args) throws IOException { 56 //1.实例化一个Socket 57 Socket socket = new Socket("192.168.38.91",8888); 58 //2.获取输出流 59 OutputStream out = socket.getOutputStream(); 60 //3.发送数据 61 out.write("你好,这里是TCP发送的数据,请接收......".getBytes()); 62 //4.等待服务器端反馈 63 //获取输入流 64 InputStream in = socket.getInputStream(); 65 //一次读取一个字节数组 66 byte[] byteArray = new byte[1024]; 67 int len = in.read(byteArray); 68 String s = new String(byteArray,0,len); 69 System.out.println("客户端:接收到反馈:" + s); 70 71 //释放资源 72 in.close(); 73 out.close(); 74 socket.close(); 75 76 } 77 }
8.客户端键盘录入服务器控制台输出
接收端:
1.实例化ServerSocket
2.获取输入流;
3.循环接收数据,直到接收到886结束;
4.释放资源
发送方:
1.建立Socket;
2.获取输出流;
3.循环获取控制台数据,并发送;
4.如果输入886,结束;
5.释放资源
1 public class Receive { 2 public static void main(String[] args) throws IOException { 3 ServerSocket server = new ServerSocket(8888); 4 System.out.println("等待连接......"); 5 Socket socket = server.accept(); 6 System.out.println("有客户端连接!"); 7 InputStream in = socket.getInputStream(); 8 byte[] byteArray = new byte[1024]; 9 int len = 0; 10 while(true){ 11 len = in.read(byteArray); 12 String s = new String(byteArray,0,len); 13 System.out.println("接收到:" + s); 14 //判断886 15 if(s.equals("886")){ 16 System.out.println("发送端下线了,我也下线,拜拜......"); 17 break; 18 } 19 } 20 //释放资源 21 in.close(); 22 socket.close(); 23 server.close(); 24 25 26 } 27 } 28 29 public class Send { 30 public static void main(String[] args) throws IOException{ 31 Socket socket = new Socket("192.168.38.91",8888); 32 Scanner sc = new Scanner(System.in); 33 OutputStream out = socket.getOutputStream(); 34 35 while(true){ 36 System.out.print("请输入发送的信息:"); 37 String info = sc.next(); 38 out.write(info.getBytes()); 39 40 if(info.equals("886")){ 41 break; 42 } 43 } 44 //释放资源 45 out.close(); 46 socket.close(); 47 System.out.println("客户端结束!"); 48 49 } 50 }