黑马程序员 网络编程
网络编程三要素:IP 寄信的地址
端口 相当于收件人.在计算机上,可以同时有多个程序接收网络数据,每个程序都会占用至少一个端口.
协议 双方都要看得懂
一.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.254172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254192.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).安全,速度慢--连接时,需要双方发送握手信息;
类似于:打电话;
InetAddress 类:此类表示互联网协议 (IP) 地址。
*
* 要掌握的功能
获取任意主机:InetAddress static getByName(String hostName):
主机名:getHostName():
主机Ip地址:getHostAddress()
*/
public class Demo {
public static void main(String[] args) throws Exception {
InetAddress add = InetAddress.getByName("Lenovo-PC");
//获取主机名
String hostName = add.getHostName();
String ip = add.getHostAddress();
System.out.println("计算机名:" + hostName + " IP : " + ip);
}
}
UDP:1.将数据及资源和目的封装到数据包中,不需要建立连接
2.每个数据包的大小不超过64k
3.因无连接,是不可靠协议
4.不需要建立连接,速度快
UDP的发送与接收
UDP的发送:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
/*
* UDP的发送方:
*
* 1.实例化一个Socket:DatagramSocket
* 2.准备数据:
* 1).目标IP;
* 2).目标端口;
* 3).信息内容;
* 3.封装数据报:DatagramPacket
* 4.调用DatagramSocket的send()方法,发送:数据报
*/
public class Demo {
public static void main(String[] args) throws IOException {
// 1.实例化一个Socket:DatagramSocket
DatagramSocket sendSocket = new DatagramSocket();
// 2.准备数据:
InetAddress ip = InetAddress.getByName("Lenovo-PC");
int port = 8888;
byte[] byteArray = "你好,这里是通过UDP发送的数据,请接收.....".getBytes();
// 3.封装数据报:DatagramPacket
DatagramPacket packet = new DatagramPacket(byteArray,
byteArray.length,
ip, port);
//4.发送数据
sendSocket.send(packet);
//5.释放资源
sendSocket.close();
System.out.println("信息已发送!");
}
}
UDP的接收
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/*
* UDP的接收方:
*
* 1.建立Socket对象:DatagramSocket(监听端口)
* 2.建立一个空的byte[]数组,准备接收数据;
* 3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接;
* 4.调用DatagramSocket的receive()等待信息;
* 5.一旦有信息火来,receive()将会返回,并且将信息填充到数据报对象中;
* 6.通过数据报对象获取信息;
*/
public class Demo {
public static void main(String[] args) throws IOException {
//1.建立Socket对象:DatagramSocket(监听端口)
DatagramSocket socket = new DatagramSocket(8888);
//2.建立一个空的byte[]数组,准备接收数据;
byte[] byteArray = new byte[1024];
//3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接;
DatagramPacket packet = new DatagramPacket(byteArray,byteArray.length);
//4.调用DatagramSocket的receive()等待信息;
System.out.println("等待信息.....");
socket.receive(packet);//程序将在这里阻塞,等待信息,如果有信息来,此方法将返回,并将数据填充到packet中
System.out.println("有信息到达!");
//6.通过数据报对象获取信息;
//IP地址:
String ip = packet.getAddress().getHostAddress();
//信息:
byte[] infoArray = packet.getData();//获取信息内容
String str = new String(infoArray,0,packet.getLength());
System.out.println("接收方接收到信息:IP:" + ip + " 内容:" + str);
//释放资源
socket.close();
}
}
TCP: 1.建立连接形成传输数据的通道
2.在连接中进行大数据量传输
3.通过三次握手完成链接,是可靠协议
4.必须建立链接,效略会稍低
用UDP编写一个聊天程序,需要两个线程,一个收一个发
因为首发动作不一致,所以要定义两个run方法,并分别封装到不同的类中.
TCP分客户端Socket和服务端ServerSocket
TCP的发送与接收
TCP的发送:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/*
* TCP的发送端:
*
* 面向连接的,一定要有接收方存在
*
* 步骤:
*
* 1.实例化一个Socket:java.net.Socket
* 构造方法:Socket(String host, int port)
* 2.因为要发送,通过Socket对象获取一个输出流:
* 3.通过输出流输出信息;
* 4.释放资源;
*
*/
public class Send {
public static void main(String[] args) throws IOException{
//1.实例化一个Socket:java.net.Socket
Socket socket = new Socket("192.168.38.91",8888);
//2.因为要发送,通过Socket对象获取一个输出流:
OutputStream out = socket.getOutputStream();
//3.一次输出一个字节数组
out.write("你好,这里是通过TCP发送的数据,你能收到吗?".getBytes());
//4.释放资源
out.close();
socket.close();
}
}
TCO