网络编程和Socket通信

网络编程

第一章:网络编程基础
  1. 计算机网络

    所谓计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源

  2. 网络编程

    所谓网络编程,指的就是在同一个网络中不同机器之间的通信

第二章:计算机之间通信的条件
  1. IP地址

    IP地址指的是互联网地址(Internet Protocol Address ) ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的

    IP地址是数字型的,是一个32位的整数,通常将其分成4个8位的二进制数,每8位之间用圆点隔开, 每个8位

    整数可以转换为一个0~255的十进制整数,例如:202.9.128.88

    分为IPV4和IPV6

    IP地址分类

    A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254

    B类:分配给中型企业,1.0.0.1 ~ 126.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地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口

  2. 端口

    数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口

    端口号的取值范围:0~65535

    端口分类:

    公认端口:0~1023

    注册端口:1025~49151

    动态或私有端口:1024~65535

    常用端口:

    mysql:3306

    oracle:1521

    tomcat:8080

    Nginx: 80

    Redis:6379

    Zookeeper分布式协调服务:2181

    Dubbo:20880

    Eurker:8761

  3. 协议

    需要通信的设备之间需要实现相同的通信协议

    网络分层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

    通信协议分类:

    传输层协议:TCP和UDP

    网络层IP协议:IPV4和IPV6,互联网协议应用层协议:HTTP

第三章:相关类的使用
  1. InetAddress类

    Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个子类:

    Inet4Address,Inet6Address,分别表示IPv4和IPv6

    常用方法:

    //1.获取主机:主机名称和ip地址 
    /**
      * static InetAddress getLocalHost() 返回本地主机。
     */ 
    InetAddress id1 = null; 
    try {
        id1 = InetAddress.getLocalHost(); 
        //USER-VG9EDR1SST/10.31.165.42 
        System.out.println(id1);
    } catch (UnknownHostException e) { 
        // 未知的主机
        e.printStackTrace(); 
    }
    
    //2.获取ip地址的字符串表示形式 
    /**
      * String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 
    */ 
    String str1 = id1.getHostAddress();
    System.out.println(str1);//10.31.165.42 
    
    //3.获取主机名 
    /**
      * String getHostName() 获取此 IP 地址的主机名。
    */ 
    String str2 = id1.getHostName();
    System.out.println(str2); 
    
    //4.根据主机或者ip地址获取InetAddress对象 
    /**
      * static InetAddress getByName(String host) 
      * 在给定主机名的情况下确定主机的 IP 地址。
     */ 
    try {
        InetAddress id2 = InetAddress.getByName("10.31.165.42"); 
        ///10.31.165.42 
        System.out.println(id2); 
        InetAddress id3 = InetAddress.getByName("www.baidu.com"); 
        //www.baidu.com/115.239.211.112
        System.out.println(id3);
    } catch (UnknownHostException e) { 
        e.printStackTrace(); 
    }
    
    //5.根据主机或者ip地址获取所有InetAddress对象 
    /**
      * static InetAddress[] getAllByName(String host)
      */ 
    try {
        InetAddress[] arr = InetAddress.getAllByName("www.baidu.com"); 
        for(InetAddress address:arr) { 
            //www.baidu.com/115.239.210.27 
            System.out.println(address.toString()); 
            //115.239.210.27 
            System.out.println(address.getHostAddress()); 
            //www.baidu.com 
            System.out.println(address.getHostName());
        }
    } catch (UnknownHostException e) { 
        e.printStackTrace(); 
    }
    
  2. UELEncoder类和URLDecoder类

    URLEncoder类和URLDecoder类用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的转换

    //%E5%8D%83%E9%94%8B 
    //URLDecoder:解码,将特殊中文字符串转换为普通字符串 
    String string1 = URLDecoder.decode("%E5%8D%83%E9%94%8B", "utf-8"); 
    System.out.println(string1); 
    
    //URLEncoder:编码,将普通字符串转换为特殊字符串 
    String string2 = URLEncoder.encode("Java的开发指南", "GBK"); 
    System.out.println(string2); 
    
    //注意:编码和解码需要采用相同的字符集 
    String string3 = URLDecoder.decode(string2, "utf-8"); 
    System.out.println(string3);
    
第四章:基于TCP的网络编程
  1. 概念

    TCP,Transmission Control Protocol,传输控制协议,基于字节流的传输层通信协议

    特点:

    a.安全的

    b.面向链接的

    c.面向链接的

    d.传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据

    TCP的三次握手

    a.客户端向服务端发送一个请求

    b.服务端收到请求后,回客户端一个响应

    c.客户端向收到服务端的响应后,回服务端一个确认信息

    在这里插入图片描述
    在这里插入图片描述

  2. Socket通信模型

    在这里插入图片描述

第五章:Socket和ServerSocket
  1. 互相通信
    //客户端
    			Socket s=new Socket("10.9.46.134",9090);
    			OutputStream os = s.getOutputStream();
    			os.write("涛哥牛逼".getBytes());
    			/*** Connection reset:连接重置 
    			* 出现的原因: 
    		 	* a.如果服务端因为某种原因关闭,但是客户端仍然在访问服务端
                   * b.如果多个人同时访问同一个ip地址和端口的话
                   ** 解决办法: 
                   * 在ServerSocket服务端调用Socket类中shutdownOutput(),作用禁用输出流 
                   */
    			s.shutdownOutput();
    			InputStream is = s.getInputStream();
    			byte [] b=new byte[1024];
    			int len;
    			while((len=is.read(b))!=-1){
    				System.out.println(new String(b,0,len));
    			}
    			os.close();
    			is.close();	
    			
    //服务端
    		ServerSocket ss= new ServerSocket(9090);
    		Socket acc=ss.accept();
    		InputStream is = acc.getInputStream();
    		byte [] b=new byte[1024];
    		int len;
    		while((len=is.read(b))!=-1){
    			System.out.print(new String(b,0,len));
    		}
    		
    		OutputStream os = acc.getOutputStream();
    		os.write("已收到".getBytes());
    		
    		os.close();
    		ss.close();
    		acc.close();
    		is.close();
    
  2. 上传下载
    //客户端
    		Socket s= new Socket("10.9.46.134",9090);
    		OutputStream os = s.getOutputStream();
    		FileInputStream fis=new FileInputStream("D:/IU/图片2.png");
    		byte [] b=new byte[1024];
    		int len;
    		while((len=fis.read(b))!=-1){
    			os.write(b,0,len);
    		}
    		fis.close();
    		s.shutdownOutput();
    		
    		InputStream is = s.getInputStream();
    		byte [] b2=new byte[1024];
    		int len2;
    		while((len2=is.read(b2))!=-1){
    			System.out.println(new String(b2,0,len2));
    		}
    //		os.close();
    //		is.close();
    		s.shutdownInput();
    
    //服务器端
    		ServerSocket ss=new ServerSocket(9090);
    		Socket acc = ss.accept();
    		InputStream is = acc.getInputStream();
    		FileOutputStream fos=new FileOutputStream("D:/IO/图片2.png");
    		byte [] b= new byte[1024];
    		int len ;
    		while((len=is.read(b))!=-1){
    			fos.write(b,0,len);
    		}
    		
    		fos.close();
    		acc.shutdownInput();
    		OutputStream os = acc.getOutputStream();
    		os.write("收到照片".getBytes());
    		acc.shutdownOutput();
    //		is.close();
    //		os.close();
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值