13.从零开始学习Java-网络编程

转载请标明原文地址,后续会持续更新《从零开始学习》系列,数据结构和算法,Mysql和ssm框架。
如果有问题可以私信或者直接在文章下评论,大概晚上会回。
如果零基础的同学没有学习的大概方向也可以私信问我,发给你一些学习路线和一些B站的学习视频地址。
希望能为世界带来些微价值,peace!

网络编程

一、什么是网络

由点和线构成,表示诸多对象间的相互联系。

二、计算机网络

  • 为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)。
    互联网:(Internet)点与点相连
  • 万维网:(WWW – World Wide Web)端与端相连
  • 物联网:( IoT - Internet of things) 物与物相连
  • 网络编程:让计算机与计算机之间建立连接、进行通信。

三、网络模型

OSI(Open System Interconnection)开放式系统互联。

OSI

TCP/IP模型:

一组用于实现网络互连的通信协议,将协议分成四个层次。

TCP IP

四、通信协议

TCP/UDP

  • TCP协议:Transmission Control Protocol 传输控制协议
    • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连 接的过程需要三次握手,断开连接的过程需要四次挥手。
  • UDP协议:User Datagram Protocol 用户数据报协议//游戏中的高pin战士就是UDP协议。
    • 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小 64KB。

五、IP与端口

IP

  • IP协议:Internet Protocol Address 互联网协议地址/网际协议地址
    • 分配给互联网设备的数字标签(唯一标识)。
  • IP地址分为两种:
    • IPV4:4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位 整数可以转换为一个0~255的十进制整数。 格式:D.D.D.D 例如:255.255.255.255
    • IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16位整数可以转换为一个0~65535的十进制数。
      • 格式:X.X.X.X.X.X.X.X 例如:FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF

IPV4的应用分类

  • A类:政府机构,1.0.0.1 ~ 126.255.255.254
  • B类:中型企业,128.0.0.1 ~ 191.255.255.254
  • C类:个人用户,192.0.0.1 ~ 223.255.255.254
  • D类:用于组播,224.0.0.1 ~ 239.255.255.254
  • E类:用于实验,240.0.0.1 ~ 255.255.255.254
  • 回环地址:127.0.0.1,指本机,一般用于测试使用。
  • 查看IP命令:ipconfig
  • 测试IP命令:ping D.D.D.D

Port

  • 端口号:

    在通信实体上进行网络通讯的程序的唯一标识。

  • 端口分类:

    • 公认端口:0~1023
    • 注册端口:1024~49151
    • 动态或私有端口:49152~65535
  • 常用端口:

    • MySql:3306
    • Oracle:1521
    • Tomcat:8080
    • SMTP:25
    • Web服务器:80
    • FTP服务器:21

六、网络编程

InetAddress类

  • 概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息, 并提供获取信息的常用方法。
  • 方法:
    • public static InetAddress getLocalHost() 获得本地主机地址对象
    • public static InetAddress getByName(String host) 根据主机名称获得地址对象
    • public static InetAddress[] getAllByName(String host) 获得所有相关地址对象
    • public String getHostAddress() 获取IP地址字符串
    • public String getHostName() 获得IP地址主机名
public class TestInetAddress {

	public static void main(String[] args) throws UnknownHostException {
		
		//获得本机IP地址对象
		InetAddress localhost = InetAddress.getLocalHost();
		
		//获得IP地址字符串
		//System.out.println(localhost.getHostAddress());
		
		//获得IP地址对应主机名称
		//System.out.println(localhost.getHostName());
		
		
		//获得任意主机的IP地址对象(IP、主机名、域名)
		InetAddress baidu = InetAddress.getByName("www.baidu.com");
		
		//System.out.println(baidu.getHostAddress());
		
		//System.out.println(baidu.getHostName());
		
		
		//获得任意域名所绑定的所有IP地址对象
		InetAddress[] addrs = InetAddress.getAllByName("www.baidu.com");
		
		for (InetAddress addr : addrs) {
			System.out.println(addr.getHostAddress());
			System.out.println(addr.getHostName());
		}
		
	}

}

//没有构造方法的调用,直接调用类的方法。

public class TestInetAddress {
    public static void main(String[] args){
      MyClass myClass = MyClass.getMyClassInstance();
    }
}
class MyClass{
    private MyClass(){//1.没有构造方法

    }
    public static MyClass getMyClassInstance(){//2.通过.方法调用//规范得到对象的思路
        return new MyClass();
    }
}

基于TCP的网络编程

  • Socket编程:
    • Socket(套接字)是网络中的一个通信节点。
    • 分为客户端Socket与服务器ServerSocket。
    • 通信要求:IP地址 + 端口号。

开发步骤

  • 建立通信连接(会话):
    • 创建ServerSocket,指定端口号
    • 调用accept等待客户端接入
  • 客户端请求服务器:
    • 创建Socket,指定服务器IP + 端口号
    • 使用输出流,发送请求数据给服务器
    • 使用输入流,接收响应数据到客户端(等待)
  • 服务器响应客户端:
    • 使用输入流,接收请求数据到服务器(等待)
    • 使用输出流,发送响应数据给客户端
public class MyServer {
    public static void main(String[] args) throws IOException {
        //定义服务器
        ServerSocket serverSocket = new ServerSocket(7777);
        //接入客户端
        Socket accept = serverSocket.accept();
        //读数据(接受请求)
        InputStreamReader inputStreamReader = new InputStreamReader(accept.getInputStream(), "UTF-8");
        BufferedReader request = new BufferedReader(inputStreamReader);

        //数据处理
        String s = request.readLine();
        s = s.toUpperCase();

        //写数据(返回响应)
        PrintWriter response = new PrintWriter(new OutputStreamWriter(accept.getOutputStream(),"UTF-8"));
        response.println(s);
        response.flush();

        //关闭该客户端请求
        accept.close();

    }
}

public class MyClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",7777);
        //写数据(发送请求)
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter request = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        request.println("HelloWorld");
        request.flush();
        //读数据(接收响应)
        BufferedReader response = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
        String s = response.readLine();
        //处理
        System.out.println(s);

        socket.close();
    }
}
public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(8888);
        //接入客户端
        Socket client = serverSocket.accept();
        //获得请求对象
        BufferedReader request = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
        //接收客户端请求数据
        String userInfo = request.readLine();
        //保存用户信息
        String result = saveUserInfo(userInfo);
        //获得响应对象
        PrintWriter reponse = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
        reponse.println(result);
        reponse.flush();
        //将操作结果返回给客户端
    }
    public static String saveUserInfo(String userInfo) throws IOException {
        //创建流,执行一个properties文件
        PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("E:\\Files\\userInfo.properties",true),"UTF-8"));
        //解析出id的值作为“=”前得key、直接将userInfo代表的字符串作为”=“后的value
        String id = getId(userInfo);
//        System.out.println(id);
        //保存用户信息到文件中
        Properties properties = new Properties();
        properties.setProperty(id, userInfo);//key value
        properties.store(out, "注释");//把key value以流的形式存到pro文件中
        return "RegisterSuccessful" ;
    }
    public static String getId(String userInfo){
        int startIndex = userInfo.indexOf(":") ;
        int endIndex = userInfo.indexOf(",");
        return userInfo.substring(startIndex,endIndex);//第一个冒号+1,第一个逗号结束
    }
}


//完成注册与登录功能
public class Client {
    private  static final Scanner input = new Scanner(System.in);
    public static void main(String[] args) throws IOException {
        Socket client = null;
        client = new Socket("127.0.0.1",8888);
        //采集用户信息
        String userInfo = registMenu();
        //获得请求对象
        PrintWriter request = new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"));
        //用流的方式向服务器发送请求数据
//        System.out.println(userInfo);
        request.println(userInfo);
        request.flush();
        //获得响应对象
        BufferedReader reponse = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
        //接收服务器的响应结果
        String result = reponse.readLine();
        //客户端本地打印操作结果
        System.out.println(result);
        client.close();
    }

    private static String registMenu() {
        System.out.println("请输入学号:");
        String id = input.next();
        System.out.println("请输入密码:");
        String pwd = input.next();
        System.out.println("请输入姓名:");
        String name = input.next();
        System.out.println("请输入性别:");
        String sex = input.next();
        System.out.println("请输入年龄:");
        String age = input.next();
        System.out.println("请输入成绩:");
        Double score = input.nextDouble();
        //返回整理后的字符串(约定-->协议)

        return  toJSON(id,pwd,name,sex,age,score);
    }

    /**
     * 将零散数据整合成一个
     * @return  格式字符串
     * @param id
     * @param pwd
     * @param name
     * @param sex
     * @param age
     * @param score
     */
    public static String toJSON(String id, String pwd, String name, String sex, String age, Double score){
        String json = "{id : "+id+",pwd :" + pwd +",name :" + name +",sex :" + sex +",age :" + age +",score :" + score + "}";
        return json;
    }
}
案例:
  • 案例1:TCP编程实现客户端发送数据给服务器端

  • 案例2:TCP编程实现客户端上传文件给服务器端

  • 案例3:TCP实现多个客户端发送数据给服务器端

  • 使用Socket编程实现服务器端注册:

    • 注册信息保存在properties文件中。
    • 封装格式:
    • id = {id : ”1001”, name :“tom”, pwd : ”123”, age : 20 , score : 98.5}
    • 注册成功后返回字符串“注册成功”。
  • 使用Socket编程实现服务器端登录:

    • 获取properties文件中的用户信息,进行用户名与密码的校验。
    • 校验成功后返回字符串“登录成功”。

总结

  • 计算机网络:
    • 为实现资源共享和信息传递,通过通信线路连接起来的若干主机。
  • TCP协议:
    • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。
  • IP:
    • 分配给互联网设备的数字标签(唯一标识)。
  • Port:
    • 在通信实体上进行网络通讯的程序的唯一标识。
  • Socket编程:
    • 建立连接、接收请求、发送响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值