黑马程序员——java-网络编程

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

1
InetAddress类的概述和使用

该类没有构造方法:
没有构造方法的类是什么情况:
A:单例设计模式(Runtime)
B:类中的成员变量都是静态的
C:通过一个静态方法返回该类的对象

//public static InetAddress getByName(String host)
        //根据主机名获得Ip地址对象
        InetAddress address=InetAddress.getByName("lin-pc");

        System.out.println(address );
        //获取主机名public String getHostName()
        String nameString=address.getHostName();
        System.out.println(nameString );
        //获取ip地址
        String ip=address.getHostAddress();
        System.out.println(ip);

网络通信的三要素:
A:IP地址

计算机在网络中的唯一标识。
现在使用的是:"点分十进制"

B:端口号

每一个进程的逻辑地址就是一个标识号
一个进程就是一个应用程序,所以可以说端口号就是应用程序的标识号
端口号是有范围的: 0--65535
0-1204的端口号不能随便取,这是操作系统的进程所占用的

C:协议

通信的规则。

        UDP:不建立连接,数据打包传输,数据有限制(64K),数据不可靠,速度快。
        TCP:建立连接,数据无限制,数据可靠,速度慢。

4
Socket服务:
两个计算机之间通信,需要知道ip地址,以及端口号,Socket服务就包装了这两个东西
5
UDP发送和接收数据
先开启谁都无所谓。
先来掌握一个重要的类

DatagramSocket--此类表示用来发送和接收数据报包的套接字。

   构造方法--public DatagramSocket()
      构造数据报套接字并将其绑定到本地主机上任何可用的端口
   构造方法--public DatagramSocket(int port)
      创建数据报套接字并将其绑定到本地主机上的指定端口
   成员方法--public void send(DatagramPacket p)
      从此套接字发送数据报包
      参数:DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号

DatagramPacket--此类表示数据报包。

  构造方法——public DatagramPacket(byte[] buf,
                  int length,
                  InetAddress address,
                  int port)
                  参数:
               buf - 包数据。
               length - 包长度。 
               address - 目的地址。
               port - 目的端口号
   构造方法———public DatagramPacket(byte[] buf,
                  int length)用来接收长度为 length 的数据包。
    参数:     buf - 保存传入数据报的缓冲区。
              len - 要读取的字节数。
   成员方法:--public byte[] getData()
            返回数据缓冲区。
           --public InetAddress getAddress()
           返回某台机器的 IP 地址

A:发送端

 public class sText
{
    public static void main(String[] args) throws IOException
    {
        /*1 创建发送端Socket服务
         *2 数据打包
         *3 发送数据
         *4 关闭流对象
         * 
         */

        //创建发送端Socket服务
        DatagramSocket ds=new DatagramSocket();
        //封装键盘数据,形成循环,可以不断的输入
        BufferedReader sb=new BufferedReader(new InputStreamReader(System.in));
        String line=null;
        while((line=sb.readLine())!=null)
        {
            if(line=="886")
            {
                break;
            }
        //数据打包
        byte[] buf=line.getBytes();
        DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("lin-pc"), 10086);
        //发送数据
        ds.send(dp);
        }
       //关闭流对象
        ds.close();

    }

}

B:接收端

public class reText
{
    public static void main(String[] args) throws IOException
    {
        /*1 创建接受端Socket服务
         *2 创建数据包,用于接受数据
         *3 接受数据
         *4解析数据
         *5关闭
         */
        //创建接受端Socket服务,并且指定接收数据的端口
        DatagramSocket ds=new DatagramSocket(10086);
        //创建数据包,用于接受数据
    while(true)
    {
        byte[] buf=new byte[1024];
        DatagramPacket dp=new DatagramPacket(buf, buf.length);
        //接受数据

        ds.receive(dp);
        //解析数据
        byte[] buff=dp.getData();
        //从发送端的数据中得到发送端的ip地址
        String ip=dp.getAddress().getHostAddress();
        //把接收到的数据转换成字符串形式
        String s=new String(buff,0,dp.getLength());
        //把数据显示在可控制台
        System.out.println(ip+"---------"+s);

    }

    }

}

6
TCP发送和接收数据必须先开启服务器。

先认识两个重要的类
   Socket(类)--此类实现客户端套接字

     构造方法--public Socket()
        通过系统默认类型的 SocketImpl 创建未连接套接字 
     构造方法--public Socket(InetAddress address,int port)       
        创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
     成员方法————public InputStream getInputStream()
         返回此套接字的输入流
     成员方法————public OutputStream getOutputStream()
         返回此套接字的输出流

   ServerSocket(类)--此类实现服务器套接字

      构造方法--public ServerSocket(int port)
         创建绑定到特定端口的服务器套接字 
      成语方法---public Socket accept()
         侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。

A:客户端:

public class client
{
    public static void main(String[] args) throws  IOException
    {
        /*1 创建发送端的Scoket对象
         *     创建此对象时,要指定目标主机和端口
         *2 获取Scoket对象的输出流(字节流)
         *3 写数据
         *4 释放资源
         * 
         */
        //Tcp协议,必须先开启服务端,

        Socket s=new Socket("lin-pc",10086);

        //获取scoket的输出流对象

        OutputStream os=s.getOutputStream();
        //写数据
        os.write("你好呀,吃饱了吗".getBytes());
        //释放资源

        os.close();
    }

}

B:服务器端:

public class Service
{
    public static void main(String[] args) throws IOException
    {
        /*
         * 1 创建服务器Socket对象。
           2监听客户端连接。
           3  获取输入流。
           4 读取数据。
           5 释放资源。
         */

        //创建服务器Socket对象。
        ServerSocket ss=new ServerSocket(10086);
        //2监听客户端连接。
        Socket socket=ss.accept();
        //3  获取输入流。
        InputStream stream= socket.getInputStream();
        //4 读取数据。
        byte[] buf=new byte[1024];
        int length=stream.read(buf);
        String string=new String(buf, 0, length);

        System.out.println(string);

        ss.close();
        stream.close();

    }

}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值