黑马程序员——Java 网络编程 (第十一篇)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------  

1)网络概述



    如果在网络之间应用程序能够通信,那么就需要三个元素(IP,端口和协议)

     IP:在网络上的每一个计算机,或者在网络上进行通信的工具,都需要标识自己,那么就会IP地址来标识,IP地址常用的是32位二进制,也有128位的二进制标识。

      端口:因为每一个设备上有很多应用程序,那么我们就需要来区分,标识这应用程序,就是每一个应用程序都有自己的端口号来标识自己,都是用数字进行标识。是逻辑地址。0~65535范围,其中0~1024不能使用,因为系统端口号或者保留端口。

     协议:就是在网络上通信的规则,必须双方都遵守这个规则,那么双方才能通信,有很多协议的,我们常用的是TCP/IP,UDP协议。

     网络模型:OSI参考模型和TCI/IP模型

            OSI参考模型:应用层,表示层,会话层,传输层,网络层,链路层,物理层

           TCP/IP体系:应用层,传输层,互联层,主机网络层



 

InetAddress类:

     1.无构造函数,可通过getLocalHost()方法获取InetAddress对象,此方法是静态的,返回本类对象。

                  InetAddress i = InetAddress.getLocalHost();

     2.如何获取任意一台主机的IP地址对象:

                1)功能:返回InetAddress对象

                2)对于任意主机,需要指定传入主机名的参数

注意:如果IP地址和对应的主机名,



import java.net.InetAddress;  
   
public class InterAddressDemo {  
  public static void main(String[] agrs) throws Exception {  
    /** 
     * 获得本机地址,名字和IP 
     */  
    InetAddress ia = InetAddress.getLocalHost();  
    System.out.println(ia);  
    System.out.println("名字:" +ia.getHostName());  
    System.out.println("地址:" +ia.getHostAddress());  
    /** 
     * 获得百度的, 
     * 地址和名字可能不唯一,因为百度对应多个IP和地址 
     */  
    InetAddress ia1=InetAddress.getByName("www.baidu.com");  
    System.out.println(ia1);  
    System.out.println("名字:" +ia1.getHostName());  
    System.out.println("地址:" +ia1.getHostAddress());  
  }  
}  
结果:  
yang-PC/192.168.1.101  
名字:yang-PC  
地址:192.168.1.101  
www.baidu.com/220.181.111.148  
名字:www.baidu.com  
地址:220.181.111.148  


  3.传输协议

           UDP:面向无连接的(发数据之前不需要建立连接,打成包,)。不可靠协议,速度快,数据报大小限制在64k内,速度快,例如:qq,网络会议

      TCP:要建立连接,可以传输大量数据  通过三次握手玩成连接是可靠协议   必须建立连接,效率低,例如:下载,打电话

 

     

Socket就是为网络服务提供的一种机制

通信的两端都有Socket

网络通信其实就是Socket的通信

数据在两个Socket间通过IO传输



 

         创建步骤:

1.建立发送端和接收端

2.建立数据包。

3.调用Socket的发送和接受方法

4.关闭Socket

需求:通过UDP传输方式,将一段文字发送出去。

1.建立udpsocket服务

2.提供数据,将数据封装到数据包中

3.通过Socket服务的发送功能,将数据包发出去

4.关闭资源

 接收:

需求:定义一个应用程序,用于接收数据并处理

1.定义UDF服务

2.定义一个数据包(无数据,用于存储接收到的字节数据),用其方法提取在包中数据信息

3.通过receive方法接受数据

4.从数据包中提取信息,然后打印在控制台上

5,关闭资源



发送

 import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
import java.net.InetAddress;  
/** 
 * 发送端 
 */  
public class UdpSend {  
  public static void main(String[] args) throws Exception{  
    /** 
     * 定义服务,可以指定当前端口,如果不指定那么就是随机的 
     *   定义数据包,指定要发送信息,长度,对方的地址和端口 
     *   发送,关闭 
     */  
        DatagramSocket socket=new DatagramSocket(20000);//如果不指定,那么就是随机分配  
        String str="hello world";  
        DatagramPacket packet=newDatagramPacket(str.getBytes(),str.length(), “192.168.1.101”,10000);  
        socket.send(packet);//发送  
        socket.close();  
  }  
   
}  

接收

import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
import java.net.InetAddress;  
/** 
 * 接收端 
 */  
public class UdpReceive {  
  public static void main(String[] args) throws Exception {  
    /** 
     * 定义服务,指定本端口号,此端口号要和发送端发动的地址一样定义数据包,然后从数据包中提取信息,关闭 
     */  
    DatagramSocket socket = new DatagramSocket(10000);  
    byte[] buf = new byte[1024];  
    DatagramPacket packet = new DatagramPacket(buf, buf.length);  
    socket.receive(packet);// 接收这是一个阻塞方法  
    System.out.println(packet.getAddress().getLocalHost());  
    System.out.println("信息:"  
         + new String(packet.getData(), 0, packet.getLength()));  
    System.out.println("端口号:" + packet.getPort());  
    socket.close();  
  }  
   
}  
结果:  
yang-PC/192.168.1.101  
信息:hello world  
端口号:20000  




三、客户端和服务的浏览器演示

        浏览器是一个标准的客户端,它可以对服务端传送过来的数据消息进行解析,把符合应用层协议的消息部分解析后,将头信息拆包掉,传送到应用层,只保留了正确的正文主题部分显示在主体部分上。

        而由于使用java编译是在传输层和网际层处理的,所以,会接受到全部的消息,包含了头消息。而浏览器处于应用层,已将发送来的头消息去除,只留下了主体信息。

示例:

        自定义服务器,用浏览器访问:

import java.io.*;  
import java.net.*;  
  
//服务器  
class  ServerDemo  
{  
    public static void main(String[] args)throws Exception   
    {  
        //创建服务,监听端口  
        ServerSocket ss=new ServerSocket(10000);  
        //获取客户端  
        Socket s=ss.accept();  
        //显示ip  
        String ip=s.getInetAddress().getHostAddress();  
  
        System.out.println(ip);  
        //读取客户端读取流数据  
        InputStream in=s.getInputStream();  
  
        byte[] buf=new byte[1024];  
        int len=in.read(buf);  
        //显示数据  
        System.out.println(new String(buf,0,len));  
        //返回信息写入客户端输出流  
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);///true一定要记得写  
  
        out.println("<font color='red' size='7'>客户端你好!</font>");  
  
        s.close();//关流  
        ss.close();  
    }  
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值