一、网络模型:
计算机之间的通信规则
1、网络模型:
OSI(Open System Interconnection)参考模型
TCP/IP参考模型
2、网络编程三要素:
IP地址
端口
协议
二、IP地址:网络中计算机的的唯一标识
1、 IP的组成:网络号 + 主机号
A类:第一号段为网络号段+后三段的主机号段
1.0.01---127.255.255.254
B类:前两个号段为网络号段+后两端的主机号段
128.0.0.1---191.255.255.254
C类:前三号段为网络号段+后一段的主机号段
224.0.0.1---239.255.255.254
D类:
224.0.0.1---239.255.255.254
E类:
240.0.0.1---247.255.255.254
2、DOS命令:
ipconfig 查看本机IP地址
ping 后面跟IP地址。测试本机与指定的IP地址间的通信是否有问题
3、特殊的IP地址:
127.0.0.1 回环地址(表示本机)
x.x.x.255 广播地址
x.x.x.0 网络地址
4、InetAddress类:
对IP地址的获取和操作
如果一个类没有构造方法:
(1)成员都是静态的(Math , Arrays , Collections)
(2)单例设计模式(Runtime)
(3)类中有静态方法返回类的对象(InetAddress)
InetAddress类的方法:
public static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址
public String getHostName():获取此 IP 地址的主机名。
public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。
查看IP地址和主机名:
package NetDemo;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("DESKTOP-3CRMG0N");
//获取主机名和IP地址
String name = address.getHostName();
String ip = address.getHostAddress();
System.out.println(name + "----" + ip);
}
}
三、端口:
正在运行的程序的标识
有效端口:0~65535,其中0~1024系统使用或者保留端口
四、协议:
1、通信的规则:
(1)UDP:
把数据打包
数据有限制
不建立连接
速度快
不可靠
(2)TCP:
建立连接通道
数据无限制
速度慢
可靠
Socket: 网络套接字
Socket包含: IP地址+端口
Socket原理机制:
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
2、UDP协议发送数据:
(1)创建发送端Socket对象
(2)创建数据,并把数据打包
(3)调用Socket对象的发送方法发送数据包
(4)释放资源
package NetDemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null) {
if("886".equals(line))
break;
//创建数据,把数据打包
//内容
byte[] b = line.getBytes();
//长度
int length = b.length;
//接收端IP
InetAddress i = InetAddress.getByName("172.28.***.41");
//端口
int port = 10000;
DatagramPacket dp = new DatagramPacket(b, length, i, port);
//调用Socket对象的发送方法发送数据包
ds.send(dp);
}
//释放资源
ds.close();
}
}
3、UDP协议接收数据:
(1)创建接收端Socket对象
(2)创建一个数据包(接收容器)
(3)调用Socket对象的接收方法接收数据
(4)解析数据包,并显示在控制台
(5)释放资源
package NetDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(10000);
while(true) {
//创建一个数据包(接收容器)
byte[] b = new byte[1024];
int length = b.length;
DatagramPacket dp = new DatagramPacket(b, length);
//调用Socket对象的接受方法接收数据
ds.receive(dp);
//解析数据包,并显示在控制台
//获取对方IP
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
byte[] by = dp.getData();
int len = dp.getLength();
String s = new String(by, 0, len);
System.out.println(ip + " 向您发送了:" + s);
}
}
}
五、实现两台电脑之间的通信:
第一步:主类,两台电脑都要有的
10020是自己电脑接收消息的端口,可以随意设置,
package ChatRoomDemo;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsend = new DatagramSocket();
DatagramSocket dreceive = new DatagramSocket(10020);
SendThread st = new SendThread(dsend);
ReceiveThread rt = new ReceiveThread(dreceive);
Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();
}
}
第二步:发送类
类中的10030是接收你信息电脑的端口号,IP也是接收你信息的电脑IP
package ChatRoomDemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendThread implements Runnable {
private DatagramSocket ds;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in ));
String line = null;
while((line = br.readLine()) != null) {
if("886".equals(line)) {
break;
}
byte[] b = line.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length,
InetAddress.getByName("172.***.22.41"), 10030);
ds.send(dp);
}
ds.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
第三步:接收类
package ChatRoomDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveThread implements Runnable {
private DatagramSocket ds;
public ReceiveThread(DatagramSocket dreceive) {
this.ds = dreceive;
}
@Override
public void run() {
try {
while(true) {
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + " 向您发送了:" + s);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
注意:要实现两台电脑的通信,接收IP地址设为对方的,自己设置自己的接收端口要和对方设置你的端口号一致,反之也一样,这样你的IP才能找到对方的IP,再接着你的端口找到对方的端口