1.多级之间的互连需要两个要素
ip:每个设备都有一个ip地址
PORT:每个应用都有一个单独的端口号
利用ip地址和端口号进行识别,可以把文件之类的发送到指定设备的指定应用上面
//而域名是封装后的IP地址,通过dns服务器,可以解析变成Ip地址
InetAddress ta5=InetAddress.getByName("www.bbbb.com");
System.out.println(ta5);
//这里封装的是一个域名,dns会将其变成一个ip地址的
//www.bbbb.com/93.179.125.154
ip 端口 dns 以及那两个封装类的关系是
2.信息传输的规则:
(1)Ip/TCP协议:更加安全可靠一点,由于其使用了三次握手四次挥手原则
(具体原理待补充)
三次握手:让客户端和服务器都能清楚地知道对方成功接收了自己的信息
四次挥手的原理在下方
而VDP协议不可靠,因为传输的是数据包,会发生丢包的情况
(待补充)
3.file类封装的是一个文件(看起来只是放了一个地址路径,其实是封装了一个文件哦)
InetAddress和InetSocketAddress有点像,分别封存了ip地址,以及ip地址加端口号
先说InetAddress
package com.Ip;
//InetAddress封装的是ip地址
//InetSocketAddress封装的是ip地址和域名;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class text {
public static void main(String[] args) throws UnknownHostException {
//这种对象创建方法是有问题的,InetAddress在源码里面是不能被挎包访问的(default)
//InetAddress ta=new InetAddress();
//要使用getName方法进行封装
//得到你的ip地址(这个也是ip地址)
InetAddress ta=InetAddress.getByName("localhost");
System.out.println(ta);
//直接输入ip地址
InetAddress ta2=InetAddress.getByName("127.0.0.1");
System.out.println(ta2);
//输入设备的名字也是可以得到ip地址的
InetAddress ta3=InetAddress.getByName("LAPTOP-EJ9AF1HK");
System.out.println(ta3);
//输入ip地址,返回ip地址
InetAddress ta4=InetAddress.getByName("192.168.56.1");
System.out.println(ta4);
InetAddress ta5=InetAddress.getByName("www.bbbb.com");
System.out.println(ta5);
//获取设备名
System.out.println(ta4.getHostName());
//获取ip地址
System.out.println(ta4.getHostAddress());
}
}
Socket在应用层和传输层之间连接的作用,在规范了传输过程中使用的有关协议,服务器和客户端都可以从这个上面获取字节流,然后进行嵌套等方式.
在客户端里Socket需要接受的是ip地址和端口号(对应服务器那边)
而服务器那边只需要ServerSocket接收对应应用的端口号
在使用accept方法获得Socket
这样一来,服务器和客户端算是建立起了联系(三四原则详见后续补充)
下面是一个简单的服务器应答代码(TCP 单线程)
package com.Ip01;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket ss=new ServerSocket(8080);
Socket s= ss.accept();
//1.阻塞方法,同样是创建套接字构建链接
ObjectInputStream oj=new ObjectInputStream(s.getInputStream());
User user=(User)oj.readObject();
//2.已经顺利接受到这个用户对象的信息了
boolean flag=false;
if(user.name.equals("a")&&user.pwd.equals("123456")){
flag=true;
}
//3.判断这个对象是什么成分
DataOutputStream os=new DataOutputStream(s.getOutputStream());
os.writeBoolean(flag);
//4.把判断结果用输出流加数据流送回去
os.close();
oj.close();
s.close();
ss.close();
//5.有关流的关闭
}
}
package com.Ip01;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
//客户端负责的任务是
public class Client {
public static void main(String[] args) throws IOException {
//1.成功创建套接字,形成有效的TCP链接
Socket s=new Socket("192.168.56.1",8080);
//2.把要输入的东西变成一个对象储存起来
Scanner sc=new Scanner(System.in);
System.out.println("请输入姓名");
String name=sc.next();
System.out.println("输入密码");
String pwd=sc.next();
User user=new User(name,pwd);
//利用套接字创建输出流,再套上一个对象流,把对象变成二进制文件再通过网络传出去
ObjectOutputStream oj=new ObjectOutputStream(s.getOutputStream());
oj.writeObject(user);
//这里开始读入服务器端返回来的信息,这次是输入流套上一个数据流
//就能再程序里面读出这是一个boolean
DataInputStream os=new DataInputStream(s.getInputStream());
if(os.readBoolean()){
System.out.println("恭喜你登陆成功");
}else {
System.out.println("错啦");
}
//有关流一定要全部关闭
os.close();
oj.close();
s.close();
}
}
(注:阻塞方法指的是程序运行到这一步就需要接受点东西才能往下走下去,这里就是,accept就是一个接受方法,他必须和客户端传来的套接字匹配上.这也就是为什么先走服务器再走客户端)
(注2:需要开启多项目选项才能完成上述开一半就去开另一个的操作)
等待多线程和TCP>UDP学完之后再进行补充



