黑马程序员_笔迹十二_网络编程

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

java的网络编程提供了两种网络通信协议:TCP(传输控制协议)和UDP(数据报协议).

TCP:是可靠的传输协议,传输前会采用三方握手的方式建立连接,已保证传输的可靠信

UDP:是不可靠的传输协议,既发送出去的数据不一定收到,聊天工具一般采用此种协议

 

IP地址介绍

互联网上的每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址。java中用InetAddress来表示IP地址的对象

InetAddress

InetAddress类主要表示IP地址,这个类有2个子类:Inet4AddressInet6Address.常用方法如下

getByName(String host)根据主机名称取得InetAddress对象

InetAddress getLocalHost()通过本机取得Inet4Address对象

getHostName()得到IP地址

 

代码实例--测试InetAddress

public class Demo {

 

    public static void main(String[] args) throws Exception {

        InetAddresslocAdd = null ;

        InetAddress remAdd = null ;

        locAdd= InetAddress. getLocalHost() ;//得到本机

        System. out.println("本机的IP地址:" + locAdd.getHostAddress()) ;

        System. out.println("本机是否可达:" + locAdd.isReachable(5000)) ;

 

    }

 

}

结果:本机的IP地址:192.18.78.1

本机是否可达:true

 

URL(统一资源定位符)

URL统一资源定位符,可以直接使用此类找到互联网上的资源

常用方法

URLString spec)根据指定的地址实例化对象

RULString protocolString hostint portString file)实例化url对象,指定协议主机,端口名称,资源文件

URLConnection openConnection()取得一个URLConnection对象

InputStream openStream()取得输入流

 

代码实例读取http://hao.360.cn/的一个子页面资源

 

import java.net.URL ;

import java.io.InputStream ;

import java.util.Scanner ;

public class Demo{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        URLurl = new URL("http","hao.360.cn" ,80, "brother.html#!tv" ) ;

        InputStreaminput = url.openStream() ;     //打开输入流

        Scannerscan = new Scanner(input);     //实例化Scanner

        scan.useDelimiter( "\n") ;   //设置读取分隔符

         while(scan.hasNext()){

            System. out.println(scan.next()) ;

        }

    }

};

 

 

URLConnection对象

是封装访问远程网络资源的一般方法的类,通过他可以建立与远程服务器的连接,检查远程资源的属性

常用方法

int getContentLength()取得内容的长度

String getContentType()取得内容的类型

InputStream getInputStream()取得连接的输入流

 

代码实例-取得URL的基本信息

 

public class Demo{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        URLurl = new URL("http://www.sohu.com" ) ;

        URLConnectionurlCon = url.openConnection() ;  //建立连接

        System. out.println("内容大小:" + urlCon.getContentLength()) ;

        System. out.println("内容类型:" + urlCon.getContentType()) ;

    }

};

结果:

内容大小:-1

内容类型:text/html

 

TCP程序设计

java中使用Socket(套接字)完成TCP的程序,使用此类可以方便的建立可靠的,双向的,持续,,点对点的通信连接

Socket的程序中,服务器端使用ServerSocket等待客户端的连接,对于java的网络程序来说,每一个客户端都使用一个Socket对象

ServerSocket类与Socket

 

ServerSocket类主要用在服务器

ServerSocket类常用方法

ServerSocketint port)创建ServerSocket对象,指定监听的端口

Socket accept() 等待客户端连接

在服务器端运行时都使用accep()方法后等待客户端连接,此方法执行之后服务器进入阻塞状态,知道客户端连接之后程序才可以向下继续执行。此方法的返回值类型是Socket,每一个Socket都表示一个客户端对象

InetAddress getInetAddress()返回服务器IP

close()关闭ServerSocket

 

Socket类的常用方法

SocketString hostint port)构造Socket对象,指定主机名称和端口

InputStream getInputStream() 返回套接字输入流

OutputStream getOutputStream() 返回套接字输出流

close()关闭套接字

 

 

代码实例---服务器向客户端输出“hello world”

服务器代码

public class HelloServer{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        ServerSocketserver = null ;        //定义ServerSocket

        Socketclient = null ;  //表示客户端

        PrintStreamout = null ;        //打印流输出最方便

        server= new ServerSocket(8888) ;   //服务器在8888端口上监听

        System. out.println("服务器运行,等待客户端连接。" ) ;

        client= server.accept() ;       //得到连接,程序进入到阻塞状态

        Stringstr = "hello world" ;    //表示要输出的信息

        out= new PrintStream(client.getOutputStream()) ;

        out.println(str);   //向客户端输出信息

        client.close();

        server.close();

    }

};

客户端代码

 

public class HelloClient{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        Socketclient = null ;  //表示客户端

        client= new Socket("localhost" ,8888) ;

         BufferedReader buf = null  //一次性接收完成

        buf= new BufferedReader( new InputStreamReader(client.getInputStream()));

        Stringstr = buf.readLine() ;

        System. out.println("服务器端输出内容:" + str) ;

        buf.close();

        client.close();

    }

};

结果:服务器端输出内容:hello world

 

 

经典案例——————Echo程序

echo程序是一个网络通信交互的经典案例,成为回应程序。既客户端输入哪些内容,服务器端就会在这些内容前增加“echo并将信息发回给客户端

 

服务端代码

public class EchoServer{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        ServerSocketserver = null ;        //定义ServerSocket

        Socketclient = null ;  //表示客户端

        BufferedReaderbuf = null //接收输入流

        PrintStreamout = null ;        //打印流输出最方便

        server= new ServerSocket(8888) ;   //服务器在8888端口上监听

         boolean f = true ;  //定义个标记位

         while(f){

            System. out.println("服务器运行,等待客户端连接。" ) ;

            client= server.accept() ;       //得到连接,程序进入到阻塞状态

            out= new PrintStream(client.getOutputStream()) ;

             //准备接收客户端的输入信息

            buf= new BufferedReader(new InputStreamReader(client.getInputStream()));

             boolean flag = true ;   //标志位,表示可以一直接收并回应信息

             while(flag){

                Stringstr = buf.readLine() ;         //接收客户端发送的内容

                 if(str==null ||"" .equals(str)){    //表示没有内容

                    flag= false ;  //退出循环

                } else{

                     if("bye" .equals(str)){  //如果输入的内容为bye表示结束

                        flag= false ;

                    } else{

                        out.println( "ECHO : " + str) ;  //回应信息

                    }

                }

            }

            client.close();

        }

        server.close();

    }

};

客户端代码

public class EchoClient{

    public static void main(String args[]) throws Exception {  //所有异常抛出

        Socketclient = null ;  //表示客户端

        client= new Socket("localhost" ,8888) ;

        BufferedReaderbuf = null //一次性接收完成

        PrintStreamout = null ;    //发送数据

        BufferedReaderinput = null ;   //接收键盘数据

        input= new BufferedReader(new InputStreamReader(System.in )) ;

        buf= new BufferedReader(new InputStreamReader(client.getInputStream()));

        out= new PrintStream(client.getOutputStream()) ;

         boolean flag = true ;       //定义标志位

         while(flag){

            System. out.print("输入信息:" ) ;

            Stringstr = input. readLine() ; //接收键盘的输入信息

            out.println(str);

             if("bye" .equals(str)){

                flag= false ;

            } else{

                Stringecho = buf. readLine();     //接收返回结果

                System. out.println(echo) ;  //输出回应信息

            }

        }

        buf.close();

        client.close();

    }

};

结果:服务器运行,等待客户端连接。

输入信息:hello

ECHO :hello

 

 

UDP简介

TCP的所有操作都必须建立可靠的连接,这样肯定会浪费大量的系统性能。为了减少这种开销,在网络中又提供了另外一种传输协议--UDP,是不可靠的连接,这种协议在各种聊天被广泛的应用。

 

UDP程序的实现

UDP开发中,使用DatagramPacket类包装一条要发送的信息,之后用DatagramSocket类用于完成信息的发送操作。

DatagramPacket类常用方法

DatagramPacketbyte[] buf ,int length)实例化DatagramPacket对象时指定接收数据的长度

DatagramPacketbyte[] buf ,int lengthInetAddress address,int port)实例化DatagramPacket对象时指定接收数据的长度。目标地址,端口

byte[] getData()返回接收的数据

int getLength()返回要发送或接收数据的长度

 

DatagramSocket类的常用方法

DatagramSocketint port创建DatagramSocket对象,并且指定监听的端口

send(DatagramPacket p)发送数据报

receive(DatagramPacket p)接收数据报

要想实现UDP程序,首先应该从客户端编写,在客户端指定要接收的数据的端口和取得数据

 

代码实例---UDP客户端

public class UDPClient{

    public static void main(String args[]) throws Exception{   //所有异常抛出

        DatagramSocketds = null ;      //定义接收数据报的对象

         byte[] buf = new byte[1024] ;   // 开辟空间,以接收数据

        DatagramPacketdp = null ;      //声明DatagramPacket对象

        ds= new DatagramSocket(9000) ; //客户端在9000端口上等待服务器发送信息

        dp= new DatagramPacket(buf,1024) ; //所有的信息使用buf保存

        ds.receive(dp) ;    //接收数据

        Stringstr = new String(dp.getData(),0,dp.getLength()) + "from " +

            dp.getAddress().getHostAddress()+ "" + dp.getPort() ;

        System. out.println(str) ;   //输出内容

    }

};

 

 

服务端代码

public class UDPServer{

    public static void main(String args[]) throws Exception{   //所有异常抛出

        DatagramSocketds = null ;      //定义发送数据报的对象

        DatagramPacketdp = null ;      //声明DatagramPacket对象

        ds= new DatagramSocket(3000) ; //服务端在3000端口上等待服务器发送信息\

        Stringstr = "hello World!!!" ;

        dp= new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName( "localhost"),9000) ; // 所有的信息使用 buf保存

        System. out.println("发送信息。" ) ;

        ds.send(dp);     //发送信息出去

        ds.close();

    }

}

 

 

 

小结

1 InetAddress表示IP地址的操作类,可以通过此类指定要连接的主机名称

2 在开发中如果要取得一个网络资源可以使用URL类进行定位,之后使用IO流的方式进行读取

3 ServerSocket主要用在TCP协议的服务器开发上,使用accept()fagfa等待客户端连接,每一个连接的客户端都使用一个Socket表示

4 UDP属于不可靠的连接协议,采用数据报形式,对于服务器发送的东西,客户端不一定能接收到

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值