黑马程序员-网络编程

------- android培训 java培训 、期待与您交流! ----------

  • 两种网络模型
    • OSI(Open System Interconnection开放系统互联)参考模型,它是把网络分成7层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
    • TCP/IP参考模型,它是把网络分为4层:主机至网络层、网际层、传输层和应用层。

  • 网络通讯要素
    • IP地址:网络中有数以亿计的电脑主机,每个主机都有一个唯一标识,这个标识就是IP地址。
      • IP地址由4个字节组成,我们可以通过主机名称获得每个主机的IP地址。
      • 每台计算机都有一个本地回环地址:127.0.0.1,它的主机名称是localhost。
      • java把网络编程中要操作的对象封装到net包中。
      • 代码演示获取本机IP地址和主机名:
        import java.net.*; 
        
        class IPDemo 
        { 
        public static void main(String[] args) throws UnknownHostException//未知主机异常 
        { 
        //static InetAddress getLocalHost() 
        //返回本地主机。 
        InetAddress i=InetAddress.getLocalHost(); 
        System.out.println(i); 
        //String getHostAddress() 
        //返回 IP 地址字符串(以文本表现形式)。 
        System.out.println("getHostAddress()="+i.getHostAddress()); 
        // String getHostName() 
        //获取此 IP 地址的主机名。 
        System.out.println("getHostName()="+i.getHostName()); 
        
        //static InetAddress getByName(String host) 
        //在给定主机名的情况下确定主机的 IP 地址。 
        InetAddress ia=InetAddress.getByName("127.0.0.1"); 
        System.out.println("ia.getHostAddress()="+ia.getHostAddress()); 
        System.out.println("ia.getHostName()="+ia.getHostName()); 
        } 
        } 


    • 端口号:每台电脑都可以安装很多应用程序,为了标识这些不同应用程序,所以给这些网络应用程序都用数字进行标识,以便于区分不同进程。这个数字标识就叫做端口号。电脑中的有效端口为:0~65535,其中0~1024是系统使用或保留端口。
    • 传输协议:网络中的数据传输要遵循一个通信规则,这个通讯规则称为协议。国际组织定义了一个通用协议:TCP/IP。还有一个通信协议:UDP协议。

  • TCP和UDP
    • TCP(传输控制协议)特点:
      • 建立连接,形成传输数据的通道。
      • 在连接中进行大数据量传输。
      • 通过三次握手完成连接,是可靠协议。
      • 必须建立连接,效率会稍低。
    • UDP特点:
      • 将数据及源和目的封装成数据包中,不需要建立连接。
      • 每个数据包的大小在限制在64k内。
      • 因无连接,是不可靠协议。
      • 不需要建立连接,速度快。

  • Socket:为网络服务提供的一种机制。
    • Socket就是是两台机器间通信的端点,通信的两端都有Socket。
    • 网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
    • 传输方式有两种:UDP传输和TCP传输。

  • TCP传输
    • 用于TCP数据传输的两个对象:Socket和ServerSocket。
    • 创建TCP传输大体分为3步:
      • 建立客户端和服务器端。同样,客户端与服务器端是两个独立的应用程序。
      • 建立连接后,通过Socket中的IO流进行数据的传输。
      • 关闭Socket。
    • 代码演示:
      import java.net.*; 
      import java.io.*; 
      
      
      class TcpClient 
      { 
      public static void main(String[] args) throws Exception 
      { 
      //Socket(InetAddress address, int port) 
      //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 
      Socket s=new Socket(InetAddress.getLocalHost(),10005); 
      //Socket(String host, int port) 
      //创建一个流套接字并将其连接到指定主机上的指定端口号 
      
      //OutputStream getOutputStream() 
      //返回此套接字的输出流。 
      OutputStream os=s.getOutputStream(); 
      byte[] by="tcp tong lu access!".getBytes(); 
      os.write(by); 
      
      // void close() 
      //关闭此套接字。 
      s.close(); 
      } 
      } 
      
      
      class TcpServer 
      { 
      public static void main(String[] args) throws Exception 
      { 
      //ServerSocket(int port) 
      //创建绑定到特定端口的服务器套接字。 
      ServerSocket ss=new ServerSocket(10005); 
      
      //Socket accept() 
      //侦听并接受到此套接字的连接 
      Socket s=ss.accept(); 
      
      //InetAddress getInetAddress() 
      //返回套接字连接的地址。 
      String ip=s.getInetAddress().getHostAddress(); 
      
      //InputStream getInputStream() 
      //返回此套接字的输入流。 
      InputStream is=s.getInputStream(); 
      
      byte[] b=new byte[1024]; 
      int len=is.read(b); 
      String str=new String(b,0,len); 
      System.out.println(ip+"::"+str); 
      
      //关闭客户端Socket服务 
      s.close(); 
      
      // void close() 
      //关闭此套接字。 
      //服务器端Socket服务可以不用关(可选) 
      ss.close(); 
      } 
      } 
    • TCP 传输最容易出现的问题:当客户端连接上服务端,两端都在等待,没有任何数据传输。这是因为read()方法或者readLine()方法是阻塞式的,没有读取到数据,就会一直等待。我们可以自定义一个结束标记,比如定义一个时间戳,或者使用shutdownInput()方法和shutdownOutput()方法。

  • UDP传输
    • 用于UDP传输数据的两个对象:DatagramSocket与DatagramPacket。
    • 创建UDP传输的步骤
      • 建立发送端,接收端。发送端与接收端是两个独立的运行程序。
      • 建立数据包。
      • 调用Socket的发送或接收方法。
      • 关闭Socket。
    • 代码演示UDP传输
      import java.net.*; 
      class UdpDemo { public static void main(String[] args) throws Exception//会抛出3个异常 { //DatagramSocket() //构造数据报套接字并将其绑定到本地主机上任何可用的端口。 DatagramSocket dgs=new DatagramSocket();//会抛出SocketException //DatagramPacket(byte[] buf, int length, InetAddress address, int port) //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 byte[] by="abcedhahahehe".getBytes(); //会抛出UnknownHostException DatagramPacket dgp=new DatagramPacket(by,by.length,InetAddress.getByName("127.0.0.1"),10000); //void send(DatagramPacket p) //从此套接字发送数据报包。 dgs.send(dgp);//会抛出IOException // void close() //关闭此数据报套接字。 dgs.close(); } } class UdpReceive { public static void main(String[] args)throws Exception//会抛出2个异常 { //DatagramSocket() //构造数据报套接字并将其绑定到本地主机上任何可用的端口。 //DatagramSocket(int port) //创建数据报套接字并将其绑定到本地主机上的指定端口。 DatagramSocket dgs=new DatagramSocket(10000);//会抛出SocketException //DatagramPacket(byte[] buf, int length) //构造 DatagramPacket,用来接收长度为 length 的数据包。 byte[] by=new byte[1024]; DatagramPacket dgp=new DatagramPacket(by,by.length); //void receive(DatagramPacket p) //从此套接字接收数据报包。 dgs.receive(dgp);//会抛出IOException //InetAddress getAddress() //返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 String ip=dgp.getAddress().getHostAddress(); //byte[] getData() //返回数据缓冲区。 byte[] b=dgp.getData(); //int getLength() //返回将要发送或接收到的数据的长度。 int len=dgp.getLength(); //获取字节数组中的有效元素 String data=new String(b,0,len); // int getPort() //返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 int port =dgp.getPort(); System.out.println(ip+"=="+data+"=="+port); //void close() //关闭此数据报套接字。 dgs.close(); } }
      
      
      
      
      
      
      
      
      注:参照了网上的一些内容。
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值