计算机网络:把具有独立功能的多台计算机连接起来,实现资源共享和信息传递
网络编程:实现网络互连的不同计算机上运行的程序间可以进行数据交换
网络模型:
OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层(比特)
TCP/IP参考模型:应用层、传输层、网络层、主机至网络层
网络应用程序:网络编程,IO流,多线程组成 ,另外集合比他们更重要
网络编程三要素:
A:IP地址
B:端口
C:协议
IP地址:
网络中计算机唯一的标识。
计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。
IP:192.168.1.100
换算:11000000 10101000 00000001 01100100
为了方便表示IP地址,我们就把IP地址得每一个字节上的数据换算成十进制,然后用“.”分开来表示:
“ 点分十进制”
IP地址的组成:网络号段+主机号段
A类:第一号段为网络号段+后三段的主机号段
一个网络号:256*256*256 = 16777216
B类:第二号段为网络号段+后二段的主机号段
一个网络号:256*256 = 65536
C类:前三号段为网络号段+后一段的主机号段
一个网络号:256
IP地址的分类:
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
特殊地址:
127.0.0.1 回环地址(回环地址),可用于测试本机的网络是否有问题。ping 127.0.0.1
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.0 网络地址
xxx.xxx.xxx.255 广播地址
两个DOS命令:
ipconfig 查看本机ip地址
ping 后面跟ip地址。测试本机与指定的ip地址间的通信是否有问题
如果一个类没有构造方法:
A:成员全部是静态的(Math,Arrays,Collections)
B:单例设计模式(Runntime)
C:类中有静态方法返回该类的对象(InetAddress)
class Demo{
private Demo(){}
public static Demo getXxx(){
return new Demo();
}
}
getByName 在给定主机名的情况下确定主机的ip地址 ,主机名可以是机器名,也可以是其IP地址的文本表示形式
看InetAddress的成员:public static InetAddress getAddress getByName(String host);根据主机名或者IP地址得字符串表示得到IP地址对象
public String getHostName() 获取此IP地址得主机名
public String getHostAddress() 返回IP地址字符串(以文本表现形式)
端口号:
正在运行的程序的标识。
有效端口:0~65535,其中0~1024系统使用或者保留端口(不建议使用)。
协议:
通信的规则
UDP:(不可靠协议)
把数据打包
数据有限制(限制64k)
不建立连接
速度快
不可靠
TCP:
建立连接通道
数据无限制
速度慢
可靠
举例:
UDP:发短信
TCP: 打电话
Socket:网络套接字,此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点
Socket编程,网络编程:套接字编程
DatagramSocket此类表示用来发送和接收数据报包的套接字
Socket包含了:IP地址+端口
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP协议发送数据:
A:创建放送端Socket对象
B:创建数据,并把数据打包
A:调用Socket对象的发送方法放送数据包
B:释放资源
DatagramPacket 此类套接字发送数据报包,包含的信息指示:将要发送的数据、其长度、远程主机的IP地址和远程主机的端口号
UDP协议接收数据
A:创建接收端Socket对象
B:创建一个数据包(接收容器)
C:调用Socket对象的接收方法接收数据包
D:解析数据,并显示在控制台
E:释放资源
多次启动接收端:
java.net.BindException: Address already in use: Cannot bind
端口被占用或者第一次就被占用了,那是因为电脑上的软件占用了这个端口
创建接收端Socket对象
DatagramSocket(int port);
创建一个数据包(接收容器)
DatagramPacket(byte[] buf, int length)
调用Socket对象的接收方法接收数据
public void recevice(DatagramPacket p)
解析数据包,并显示在控制台,获取对方的ip
public InetAddress getAddress()
获取数据缓冲区
public byte[] getData()
获取数据的实际长度
public int getLength()
数据来自于键盘录入
键盘录入数据要自己控制录入结束。
通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了
我们的网络程序其本质是由多线程、IO流加网络编程组成
TCP协议发送数据
A:创建发送端的Socket对象
这一步如果成功,就说明连接已经建立成功了
B:获取输出流,写数据
C:释放资源
创建发送端的Socket对象
Socket s = new Socket();
获取输出流,写数据
OutputStream os =s.getOutputStream();
os.write("".getBytes());
释放资源
s.close();
连接被拒绝。TCP协议一定要先开服务器
java.net.ConnectException: Connection refused: connect
TCP协议发送数据
A:创建接收端的Socket对象
B:监听客户端连接。返回一个对应的Socket对象
C:获取输入流,读取数据显示在控制台
D:释放资源
public class ServerSocket 此类实现服务器套接字。服务器套接字等待请求通过网络传入
它基于该请求执行某些操作,然后可能向请求者返回结果
public Socket accept() 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
getInetAddress() 返回套接字连接的地址
创建收端的Socket对象
ServerSocket ss = new ServerSocket();
监听客户端连接。返回一个对应的Socket对象
Socket s= ss.accept();
获取输入流,读取数据显示在控制台,显示IP
InputStream is= s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys,0,len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+":"str);
释放资源
s.close();
服务器和客户端相比,服务器先存在
1、创建服务器Socket对象
ServerSocket ss = new ServerSocket();
监听客户端的连接
Socket s= ss.accept(); // 阻塞
获取输入流
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys); // 阻塞
String server = new String(bys, 0, len);
System.out.println("server:"+server);
获取输出流
OuptputStream os = s.getOutputStream();
os.write("".getBytes());
释放资源
s.close();
2、创建客户端Socket对象
ClientSocket ss = new ClientSocket();
监听客户端的连接
Socket s= ss.accept();
获取输出流
OutputStream os = s.getOuptStream();
os.write("".getBytes());
获取输入流
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys); // 阻塞
String client = new String(bys, 0, len);
System.out.println("client:"+client);
释放资源
s.close();
参考网站:
https://www.bilibili.com/video/av37614313?p=728