------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一,网络编程三要素:
1.IP地址:
1).所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
2).按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,
就是4个字节。例如一个采用二进制形式的IP地址是“11000000101010000000000101100100”,这么长的地址,
人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,
上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。
例如:192.168.1.10(点分十进制)
二进制表示:11000000.10101000.00000001.00001010
每段使用8位的二进制,一共四段,一共32位表示。
表示范围:
最小IP:00000000.00000000.00000000.00000000 --> 十进制表示:0.0.0.0
最大IP:11111111.11111111.11111111.11111111 --> 十进制表示:255.255.255.255
所以每段的范围:0 -- 255:一共256个。
一共能容纳:256 * 256 * 256 * 256台电脑;
3).IP地址的组成:
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码:192.0.0.0: 范围:192.0.0.0--192.255.255.255:256 * 256 * 256台
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码:192.168.0.0: 范围:192.168.0.0--192.168.255.255:256 * 256台
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码:192.168.1.0: 范围:192.168.1.0--192.168.1.255:256台
作用:
以下有三个IP:
1).192.168.1.10;
2).192.168.1.20;
3).192.168.2.30;
上述三个IP地址,能否互相访问?由"子网掩码"来决定:它就是用来区分"网络号码"和"主机地址"的。
如果子网掩码设置为:255.255.255.0
二进制:11111111.11111111.11111111.00000000
子网掩码中,全部标示为1的为"网络号码",上述掩码表示:前三段为"网络号码",前三段相同的IP,表示在一个网段中,可以进行互访;
1)和2)之间可以互访;
如果子网掩码设置为:255.255.0.0
二进制:11111111.11111111.00000000.00000000
上述子网掩码,全部标示为1的为"网络号码",前两段为"网络号码",前两段相同表示在同一网段中,可以进行互访;
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
2.端口号:
1).分类:
物理端口:网卡口;
逻辑端口:是由操作系统维护的。将一个物理端口,映射出多个"逻辑端口",供多个网络程序使用;
2).我们讲的端口,就是"逻辑端口";
3).在Window下,维护65536个逻辑端口,端口号:0 -- 65535
4).一个网络程序要接收网络数据,至少要使用一个端口,而且是"在运行期间独占形式"。一个应用程序可以同时使用多个逻辑端口;
一个端口同时只能为一个程序服务。不能同时被多个程序使用。
5).Windows内部的逻辑端口范围为:0 -- 65535,其中:0--1024是由系统内部使用,我们尽量不要使用;我们尽量使用1024以上的
3.协议:
1).协议:双方就某些内容达成的约定;目的是使双方都按照约定去做事情;
2).网络编程中的"协议",它所表示:双方发送信息的格式以及对方解析数据的格式;
3).FTP,HTTP,UDP,TCP等等;
4).UDP特点:
1.将发送的数据打包;
2.面向无连接,发送时,不关心对方是否接收。
3.每个数据报的大小在限制在64k;
4.因为不需要连接,所以:不可靠。但速度快;
例如:广播电台,电视台发送信号;
5).TCP特点:
1.发送时,必须建立连接。必须存在接收方,否则不能发送;
2.由于需要建立连接,所以:可靠。但速度(连接速度)会相对慢一些,因为要进行一些连接验证;
例如:打电话
二,InetAddress(类):
1.此类没有构造方法;
2.通过内部的静态方法,可以获取此类的实例:
static InetAddress getByName(String host)
3.成员方法:
public String getHostName():获取主机名;
public String getHostAddress():获取IP地址
三,发送UDP协议的数据:
步骤:
1.实例化Socket:DatagramSocket对象;
2.准备发送的信息:
1).发送的信息;
2).目标计算机 的IP;
3).目标计算机的端口;
3.封装一个数据报对象:DatagramPacket对象
4.使用Socket发送数据报;
四,UDP接收数据:
步骤:
1.使用Socket建立连接:DatagramSocket
2.准备一个空的byte[]数组存储接收到的数据。
3.实例化空的数据报对象,等待发送端发送过来的数据;
五,TCP发送数据
1.实例化一个Socket对象;使用:目标计算机的IP,端口
2.要发送数据,从Socket对象中,获取一个"输出流";
3.发送数据;
4.释放资源;
注意:TCP是面向连接的,所以必须先启动"接收端"
六,TCP接收数据
接收数据:
1.实例化一个ServerSocket:使用端口;
2.等待连接:SeverSocket-->accept();
3.如果有客户端连接,accept()方法会返回,并返回一个Socket对象,这个Socket对象跟客户端的Socket是
对应的关系;
4.因为客户端先发送数据,这边要先接收数据。从网络读取数据。
获取一个"输入流"。
5.读取数据;
6.释放资源;
一,网络编程三要素:
1.IP地址:
1).所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
2).按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,
就是4个字节。例如一个采用二进制形式的IP地址是“11000000101010000000000101100100”,这么长的地址,
人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,
上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。
例如:192.168.1.10(点分十进制)
二进制表示:11000000.10101000.00000001.00001010
每段使用8位的二进制,一共四段,一共32位表示。
表示范围:
最小IP:00000000.00000000.00000000.00000000 --> 十进制表示:0.0.0.0
最大IP:11111111.11111111.11111111.11111111 --> 十进制表示:255.255.255.255
所以每段的范围:0 -- 255:一共256个。
一共能容纳:256 * 256 * 256 * 256台电脑;
3).IP地址的组成:
IP地址 = 网络号码+主机地址
A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码:192.0.0.0: 范围:192.0.0.0--192.255.255.255:256 * 256 * 256台
B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码:192.168.0.0: 范围:192.168.0.0--192.168.255.255:256 * 256台
C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码:192.168.1.0: 范围:192.168.1.0--192.168.1.255:256台
作用:
以下有三个IP:
1).192.168.1.10;
2).192.168.1.20;
3).192.168.2.30;
上述三个IP地址,能否互相访问?由"子网掩码"来决定:它就是用来区分"网络号码"和"主机地址"的。
如果子网掩码设置为:255.255.255.0
二进制:11111111.11111111.11111111.00000000
子网掩码中,全部标示为1的为"网络号码",上述掩码表示:前三段为"网络号码",前三段相同的IP,表示在一个网段中,可以进行互访;
1)和2)之间可以互访;
如果子网掩码设置为:255.255.0.0
二进制:11111111.11111111.00000000.00000000
上述子网掩码,全部标示为1的为"网络号码",前两段为"网络号码",前两段相同表示在同一网段中,可以进行互访;
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
2.端口号:
1).分类:
物理端口:网卡口;
逻辑端口:是由操作系统维护的。将一个物理端口,映射出多个"逻辑端口",供多个网络程序使用;
2).我们讲的端口,就是"逻辑端口";
3).在Window下,维护65536个逻辑端口,端口号:0 -- 65535
4).一个网络程序要接收网络数据,至少要使用一个端口,而且是"在运行期间独占形式"。一个应用程序可以同时使用多个逻辑端口;
一个端口同时只能为一个程序服务。不能同时被多个程序使用。
5).Windows内部的逻辑端口范围为:0 -- 65535,其中:0--1024是由系统内部使用,我们尽量不要使用;我们尽量使用1024以上的
3.协议:
1).协议:双方就某些内容达成的约定;目的是使双方都按照约定去做事情;
2).网络编程中的"协议",它所表示:双方发送信息的格式以及对方解析数据的格式;
3).FTP,HTTP,UDP,TCP等等;
4).UDP特点:
1.将发送的数据打包;
2.面向无连接,发送时,不关心对方是否接收。
3.每个数据报的大小在限制在64k;
4.因为不需要连接,所以:不可靠。但速度快;
例如:广播电台,电视台发送信号;
5).TCP特点:
1.发送时,必须建立连接。必须存在接收方,否则不能发送;
2.由于需要建立连接,所以:可靠。但速度(连接速度)会相对慢一些,因为要进行一些连接验证;
例如:打电话
二,InetAddress(类):
1.此类没有构造方法;
2.通过内部的静态方法,可以获取此类的实例:
static InetAddress getByName(String host)
3.成员方法:
public String getHostName():获取主机名;
public String getHostAddress():获取IP地址
三,发送UDP协议的数据:
步骤:
1.实例化Socket:DatagramSocket对象;
2.准备发送的信息:
1).发送的信息;
2).目标计算机 的IP;
3).目标计算机的端口;
3.封装一个数据报对象:DatagramPacket对象
4.使用Socket发送数据报;
四,UDP接收数据:
步骤:
1.使用Socket建立连接:DatagramSocket
2.准备一个空的byte[]数组存储接收到的数据。
3.实例化空的数据报对象,等待发送端发送过来的数据;
4.一旦有数据发送过来,解析数据;
发送端:
1.建立Scanner对象;
2.建立DatagramSocket对象;
3.从控制台读取一行数据,就封装一个新的数据报,发送;
4.当控制台输入886时,结束;
public class UDPSend {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
DatagramSocket socket = new DatagramSocket();
while(true){
System.out.print("请输入信息:");
String info = sc.next();
//封装数据报
DatagramPacket pak = new DatagramPacket(info.getBytes(),
info.getBytes().length,
InetAddress.getByName("Lenovo-PC"),
8888);
//发送数据
socket.send(pak);
//判断是否是886
if(info.equals("886")){
break;
}
}
//释放资源
socket.close();
System.out.println("发送端结束!");
}
}
接收端,只需要循环接收,遇到接收的是886时,结束。
public class UDPReceive {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
byte[] byteArray = new byte[1024];
DatagramPacket pak= new DatagramPacket(byteArray,
byteArray.length);
//要多次接收,使用循环
while(true){
socket.receive(pak);
byte[] infoArray = pak.getData();
String info = new String(infoArray,0,pak.getLength());
System.out.println("接收到信息:" + info);
if(info.equals("886")){
System.out.println("对方下线了,我也不玩了,拜拜......");
break;
}
}
//释放资源
socket.close();
}
}
五,TCP发送数据
1.实例化一个Socket对象;使用:目标计算机的IP,端口
2.要发送数据,从Socket对象中,获取一个"输出流";
3.发送数据;
4.释放资源;
注意:TCP是面向连接的,所以必须先启动"接收端"
六,TCP接收数据
接收数据:
1.实例化一个ServerSocket:使用端口;
2.等待连接:SeverSocket-->accept();
3.如果有客户端连接,accept()方法会返回,并返回一个Socket对象,这个Socket对象跟客户端的Socket是
对应的关系;
4.因为客户端先发送数据,这边要先接收数据。从网络读取数据。
获取一个"输入流"。
5.读取数据;
6.释放资源;
七,TCP协议上传文本文件并反馈代码:
发送方:
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1",8888);
//网络输出流,文件的输入流
OutputStream netOut = socket.getOutputStream();
BufferedReader fileIn = new BufferedReader(new FileReader("demo10.txt"));
//一次读取一行,发送一行
String row = null;
while((row = fileIn.readLine()) != null){
netOut.write(row.getBytes());
netOut.write("\r\n".getBytes());
}
//释放资源
fileIn.close();
netOut.close();
socket.close();
System.out.println("客户端上传完毕!");
}
}
接收端:
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("等待连接......");
Socket socket = server.accept();
System.out.println("有客户端连接成功!");
// 获取输入流,文件的输出流
BufferedReader netIn = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
BufferedWriter fileOut = new BufferedWriter(new FileWriter("demo12_copy.txt"));
//从网络一次读取一行数据,然后写入到文件中
String row = null;
while((row = netIn.readLine()) != null){
//写入到文件
fileOut.write(row);
fileOut.newLine();
}
//释放资源
fileOut.close();
netIn.close();
socket.close();
server.close();
System.out.println("服务器端程序结束!");
}
}