澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

24小时娱乐5522400Java程序设计学习笔记(六) — 网络编程

1.网络编程: 多台计算机通过物理设备(网线,wifi等)链接起来,形成了一个网络结构。

 

网络编程小结,编程一小时活动小结

  • 网络编程的概述

    24小时娱乐5522400 1

  • 网络编程的三要素

    • IP地址
      • 什么是IP地址
        • 是互联网上计算机的唯一标识.
      • InetAddress类_此类表示互联网协议 (IP) 地址
        • InetAddress类没有构造函数,使用以下方法获取InetAddress对象

static InetAddress[]

getAllByName(String host)

          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

static InetAddress

getByAddress(byte[] addr)

          在给定原始 IP 地址的情况下,返回 InetAddress 对象。

static InetAddress

getByAddress(String host, byte[] addr)

          根据提供的主机名和 IP 地址创建 InetAddress。

static InetAddress

getByName(String host)

          在给定主机名的情况下确定主机的 IP 地址。

  • getByName("主机名(可重复)/字符字符串的ip地址"):使用其他机器的ip地址字符串生成一个InetAddress对象

static InetAddress

getLocalHost()

          返回本地主机。

  • InetAddress的其它方法

String

getHostAddress()

          返回 IP 地址字符串(以文本表现形式)。

 String

getHostName()

          获取此 IP 地址的主机名。

  • 端口号
    • 端口号的范围:0~65535
    • 0~1023这个范围的端口已经被系统使用
  • 协议

    • UDP协议

      • UDP协议的特点
        • 要发送的数据必须要封装成数据包才能够发送.
        • 每个数据包大小限制在64k中.
        • 因为面向无连接,所以速度快.
        • UDP协议不分客户端和服务端,只分发送端和接受端.
      • UDP协议通讯涉及的类

        • 类 DatagramSocket

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

          • 构造方法

 

DatagramSocket()

构造数据报套接字并将其绑定到本地主机上任何可用的端口。

  • 成员方法

 void

close()

          关闭此数据报套接字。

void

send(DatagramPacket p)

          从此套接字发送数据报包。

   

参数:

p - 将要发送的 DatagramPacket。

   

  • 类 DatagramPacket

    此类表示数据报包

    • 构造方法

  

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

   

参数:

buf - 包数据。

length - 包长度。

address - 目的地址。

port - 目的端口号。

  • UDP步骤_先启动接收端,再启动发送端(如果相反会发生数据丢失)

    • 发送端_步骤:

      • 先建立UDP协议的服务

        DatagramSocket socket = new DatagramSocket();

      • 准备数据,然后把数据封装到集装箱上

        String str = "这是我第一个udp的例子";

        byte[] buf = str.getBytes();

        DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),9090);

        //参数一: 数据的内容, 参数二: 数据的长度(字节),参数三:ip地址, 参数四:端口

      • 使用UDP服务类进行发送

        socket.send(packet);

      • 关闭资源(关闭资源的作用:释放端口号)

        socket.close();

    • 接收端_步骤:

      • 建立UDP的服务,需要监听一个端口号

        DatagramSocket socket = new DatagramSocket(9090);

      • 创建一个空的集装箱用于接收数据

        byte[] buf = new byte[1024];

        DatagramPacket packet = new DatagramPacket(buf, buf.length);

      • 使用空的数据包接收数据

        socket.receive(packet); //该方法是一个阻塞型的方法。接收发送端传输过来的数据。如果没有 人给它发送消息,会一直等待下去。

        System.out.println("接收到的数据有:"+new String(buf) );

      • 关闭资源

        socket.close();

  • TCP协议

    • TCP协议的特点
      • 发送的数据是基于IO流进行发送的
      • 发送的数据是没有大小限制的
      • 使用了三次握手的机制,保证数据的完整性
      • 因为面连接,所以速度慢
      • TCP协议是分客户端和服务端的
    • 涉及的类

      • 客户端_类Socket

        此类实现客户端套接字(也可以就叫"套接字")。套接字是两台机器间通信的端点。

        • 构造方法

 

Socket(InetAddress address, int port)

          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

   

参数:

address - IP 地址。

port - 端口号。

   

  • 成员方法

 InputStream

getInputStream()

          返回此套接字的输入流。

OutputStream

getOutputStream()

          返回此套接字的输出流。

  • 服务端_类ServerSocket

    此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

    • 构造方法

 

ServerSocket(int port)

          创建绑定到特定端口的服务器套接字。

参数:

port - 端口号;或者为 0,表示使用任何空闲端口。

   

  • 成员方法

 Socket

accept()

          侦听并接受到此套接字的连接。

问题:

为什么ServerSocket没有设置获取流(getOutputStream)对应的方法了?

因为服务端跟多个客户端连接,为了防止搞乱,通过与每个客户端建立socket来操作getOutputStream和getInputStream操作

   

  • TCP步骤_先启动服务端,再启动客户端(如果相反会发生数据丢失)

    • 客户端_步骤:

      • 建立TCP协议服务

        Socket socket = new Socket(InetAddress.getLocalHost(), 9090);

      • 给服务端发送消息_客户端给服务端写数据

        OutputStream out = socket.getOutputStream();

        out.write("这个是我的第一个tcp的例子!".getBytes());

      • 获取输入流,读取服务端传输的数据

        InputStream inputStream = socket.getInputStream();

        byte[] buf = new byte[1024];

        int length = inputStream.read(buf);

        System.out.println("客户端收到的数据:"+ new String(buf,0,length));

      • 关闭客户端资源

        socket.close();

    • 服务端_步骤:

      • 建立TCP协议服务端,并且需要监听一个端口

        ServerSocket serverSocket = new ServerSocket(9090);

      • 接受客户端的请求连接

        Socket socket = serverSocket.accept(); //这个方法是一个阻塞型 的方法,如果没有客户端与其连接,会一直等待下去。

      • 获取输入流,读取客户端传输的数据

        InputStream inputStream = socket.getInputStream() ;

        byte[] buf = new byte[1024];

        int length = 0;

        length = inputStream.read(buf);

        System.out.println("服务端接收到数据:"+ new String(buf,0,length));

      • 给客户端发送消息_服务端给客户端写数据

        //给客户端发送消息 服务端给客户端写数据

        OutputStream out = socket.getOutputStream();        //获取输出流对象

        out.write("客户端,我收到了!".getBytes());

        关闭服务端资源

        serverSocket.close();

网络编程的概述 网络编程的三要素 IP地址 什么是IP地址 是互联网上计算机的唯一标识. InetAddress类_此...

 

时间:2016-5-8 02:03

2.网络编程的三要素:

 

  IP地址:即计算机在网络中的编号.

——网络编程
    
    网络传输实际上就是进行数据传输。
    一、传输的步骤:
        1、对对方IP地址进行定位。
        2、将数据打包发送到对方指定的应用程序上,为了有效的标识这些应用程序,就给这些网络应用程序使用数字进行标识。
            这些数字就叫做端口(号),该端口并不是物理上的端口,而是逻辑上的端口。
            端口号范围:0 ~ 65535,通常情况下,0 ~ 1024号端口被系统所保留了。
            Web端口:80        Tomcat服务器:8080        MySQL:3306
        3、定义通讯规则,这个通讯规则称为协议。
            为了规范标准,国际标准化组织就定义了一个通讯协议:TCP/IP协议。
            还有常用协议:UDP协议。

 

            127.0.0.1:本地回环地址,如果电脑没有配置任何IP地址的情况下,默认就是该地址,可以用来测试网卡。

  端口号:即程序在计算机中的一个编号。0--65535,1024之前的端口号禁止使用。

    二、网络模型
        OSI参考模型
            开放系统互连参考模型 (Open System Interconnect 简称OSI),为开放式互连信息系统提供了一种功能结构的框架。
            它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

 

            网络编程操作的就是网络层和传输层。
                网络层和传输层的协议是TCP/IP协议。
            Web开发操作的是应用层。
                应用层协议是HTTP协议,还有FTP协议。
        TCP/IP参考模型

  网络协议:分为UDP协议和TCP协议

    三、网络通讯要素
        IP地址
            网络中设备的标识。
            不易记忆,可用于主机名。
            本地回环地址:127.0.0.1    主机名:localhost
            广播地址:192.168.1.255    当发送数据时没有找到指定IP地址,就会将数据发送到广播地址。

    UDP协议:不需要建立稳定的链接,不可靠,安全性低,但效率高,大小有限制(64k)。**

            net包中用于描述IP地址的类是:InetAddress类,该类无构造方法,但是却有非静态方法,可以猜测该类使用了单例设计模式。
            InetAddress可以通过getLocalHost()来获取本类对象。             

    TCP协议:必须建立连接,安全性高,速度慢,效率低,大小无限制。

        四、端口号
            用于标识进程的逻辑地址,不同进程的标识不同。
            有效端口:0 ~ 65535,其中0 ~ 1024 由系统使用或是保留端口。

 

        五、传输协议
            通讯的规则。
            常见的传输协议:TCP/IP协议,UDP协议。

3.InetAddress:java中用来表示ip地址
  static InetAddress getByName(String host); //host可以是主机名,也可以是Ip地址
  String getHostAddress(); //返回 IP 地址字符串(以文本表现形式)。
  String getHostName(); //获取主机名。
  static InetAddress getLocalHost(); //获取本机的ip地址

——Socket(网络应用程序)
 
    网络编程其实就是Socket编程。
    Socket就是为网络服务提供的一种机制。
    通信的两端都有Socket。
    网络通信其实就是Socket间的通信。
    数据在两个Socket之间通过IO传输。

4.网络编程UDP协议-发送端

——TCP

  步骤:

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
    建立连接,形成传输数据的通道。
    在连接中进行大数据量传输。
    通过三次握手完成连接,是可靠协议。
    必须建立连接,效率会稍低。

  1.创建发送端Socket对象(DatagramSocket)。因为是发送端的Socket,所以不需要指定端口号

——UDP

  2.准备数据,并且打包。DatagramPacket

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议。
    是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,也就是不管对方能不能接收,只负责发送数据。
    将数据及源和目的封装在数据包中,不需要建立连接。
    每个数据包的大小限制在64KB内。
    因为无连接,所以是不可靠协议。
    不需要建立连接,速度快。

  3.发送数据

    UDP传输:
        UDP传输特有对象:
            DatagramSocket和DatagramPacket
        建立发送端和接收端
        建立数据包
        调用Socket的发送接收方法
        关闭Socket

  4.释放资源
  案例:

    发送端与接收端是两个独立运行的程序。

 1       //1.创建发送端Socket对象(DatagramSocket)。因为是发送端的Socket,所以不需要指定端口号
 2     DatagramSocket ds = new DatagramSocket();
 3     //2.准备数据,并且打包。DatagramPacket
 4     //准备数据
 5     byte[] bys = "hello udp,im comming!".getBytes();
 6     //指定接收方(收件人)的ip地址
 7     InetAddress address = InetAddress.getByName("127.0.0.1");
 8     //端口号
 9     int port = 8888;
10     DatagramPacket dp = new DatagramPacket(bys,bys.length,address,port);
11     //3.发送数据
12     ds.send(dp);
13     //4.释放资源
14     ds.close();

——注意
    每个协议有自己特有的传输方式,所以传输的对象也不同。

 

——DatagramSocket

    

        此类表示用来发送和接收数据报包的套接字(Socket、插座)
        构造方法:
            DatagramSocket()
                构造数据报套接字并将其绑定到本地主机上任何可用端口,也就是随机指定端口。
            DatagramSocket(int port)
                创建数据报套接字并将其绑定到本地主机上的指定端口。
            DatagramSocket(int port, InetAddress addr)
                创建数据报套接字,将其绑定到指定的本地地址。

5.网络编程UDP协议-接收端
  步骤:

        方法摘要:
            void bind(SocketAddress addr)
                将此DatagramSocket绑定到指定的地址和端口。
            void close()
                关闭连接。
                因为占用端口,所以需要关闭连接。
            void disconnect()
                断开套接字的连接。
            InetAddress getInetAddress()
                返回此套接字连接的地址。    
            InetAddress getLocalAddress()
                返回此套接字绑定的本地地址。
            int getLocalPort()
                返回此套接字绑定的本地主机上的端口号。
            int getPort()
                返回此套接字的端口号。
            void send(DatagramPacket p)
                从此套接字发送数据报包。
                因为需要发送的数据非常复杂,所以把数据包封装成对象。
            void receive(DatagramPacket p)
                从此套接字接收数据报包。
            boolean isBound()
                返回此套接字的绑定状态。
            boolean isClosed()
                返回是否关闭套接字。
            boolean isConnectied()
                返回套接字的连接状态。

  1.创建接收端的Socket对象(DatagramSocket)。因为是接收端,所以要明确自己是谁(端口)

——DatagramPacket

  2.准备容器。DatagramPacket

        此类表示数据报包,用来实现无连接包投递服务。
        每条报文仅根据包中包含的信息从一台机器路由到另一台机器。
        构造方法:
            凡是构造方法参数中带地址(InetAddress)和端口(port)的,都是用来发送数据的。
            DatagramPacket(byte[] buf, int length)
                构造DatagramPacket,用来接收长度为length的数据包。
                只有这一个构造方法是用来接收数据的。
            DatagramPacket(byte[] buf, int lengt, InetAddress address, int port)
                构造DatagramPacket,用来将长度为length的包发送到指定主机上的指定端口号。

  3.接收数据。签收

        方法摘要:
            InetAddress getAddress()
                返回某台机器的IP地址。
                返回的是将要发送的机器或者是已经发送到的机器的IP地址。
            byte[] getData()
                返回缓冲区数据。
            int getLength()
                返回将要发送或者接收到的数据的长度。
            int getPort()
                返回某台远程主机的端口号。
            void setData(byte[] buf)
                为此数据包设置数据缓冲区。
            void setLength(int length)
                为此数据包设置长度。
            void setPort(int port)
                为此数据包设置将要发送的远程主机的端口号。

  4.解析

——InetAddress

  5.释放资源
    案例:

    方法摘要:
        static InetAddress getByName(String host)
            在给定主机名的情况下确定主机的IP地址并获得该地址对象。
            如果使用获得的对象来获取主机名,如果主机名与IP地址在网络上没有映射关系的话,无法通过该对象获取对应IP地址的主机名。
        static InetAddress[] getAllByName(String host)
            当面对集群式服务器的时候,一个主机名可能对应多个IP,所以以数组形式接收返回对象。
        String getHostAddress()
            返回IP地址字符串。(以文本形式表现)
        String getHostName()
            获取此IP地址的主机名。
        static InetAddress getLocalHost()
            返回本地主机。 
        int hashCode()
            返回此IP地址的哈希值。
        String toString()
            将此IP地址转换为String。
        boolean isReachable(int timeout)
            测试是否可以达到该地址。 

 1 //1.创建接收端的Socket对象(DatagramSocket)。因为是接收端,所以要明确自己是谁(端口),该端口号必须和发送端的完全一致。
 2     DatagramSocket ds = new DatagramSocket(8888);
 3     //2.准备容器。DatagramPacket
 4     //byte[] bys = new byte[1024];
 5     //DatagramPacket dp = new DatagramPacket(bys,bys.length);
 6     DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
 7     //3.接收数据。签收。如果没有人发送数据,则程序在这里一直等待,直到有人发送数据。
 8     ds.receive(dp);
 9     //4.解析。当数据被接收之后,都放在了DatagramPacket中,所以,所谓的解析数据,其实就是解析DatagramPacket
10     InetAddress address = dp.getAddress(); //获取发送方的ip地址
11     int port = dp.getPort(); //获取发送方的端口号
12     byte[] data = dp.getData(); //获取发送的数据    
13     int length = dp.getLength(); //获取具体收到数据的长度
14     System.out.println("sender ---> " + address.getHostAddress());
15     System.out.println(new String(bys,0,length));
16     System.out.println(port);
17     //5.释放资源
18     ds.close();

=============================================================================
模拟一次通讯

 

发送数据        UDPSend

    

package day01;

6.网络编程TCP协议-客户端
  步骤:

 

  1.创建Socket对象。指定“服务端”的ip地址和端口号

import java.io.IOException;

  2.传输数据

import java.net.*;

  如果给“服务端”发消息,用输出流写。

 

  如果接收“服务端”发送的数据,则用输入流读。

/**

  3.释放资源

 * 需求:

    案例:
    

 * 通过udp传输方式,将没一段文字数据发送出去

 1 //1.创建Socket对象。指定“服务端”的ip地址和端口号
 2     Socket s = new Socket("127.0.0.1", 10010);
 3     // 给服务端发消息
 4     OutputStream os = s.getOutputStream();
 5     os.write("hello!!!".getBytes());
 6     os.close();
 7 
 8     // 接收“服务端”发送过来的数据
 9     InputStream is = s.getInputStream();
10     byte[] bys = new byte[1024];
11     int len = is.read(bys);
12     System.out.println(new String(bys, 0, len));
13 
14     //3.释放资源
15     s.close();

 * 步骤:

 

 * 1、建立UDPSocket服务

 

 * 2、提供数据,并将数据封装到数据包中

 

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

6.网络编程TCP协议-服务端

 * 4、关闭资源(网卡)

  步骤:

 * @author WYC

  1.创建ServerSocket对象,指定端口号

 *

  2.调用accept()方法获取Socket对象。如果有客户端访问,则该方法执行,得到一个Socket。如果没有客户端访问一直等待。

 */

  3.传输数据

public class UdpSend {

  如果给“客户端”发消息,用输出流写。

    public static void main(String[] args)

  如果接收“客户端”发送的数据,则用输入流读。

    {

  4.释放资源
    案例:

        try {

    

            //1、创建udp服务,通过DatagramSocket发送数据,如果不指定端口,则系统会随机分配一个端口号

 1 //1.创建ServerSocket对象,指定端口号
 2     ServerSocket ss = new ServerSocket(10010);
 3     //2.调用accept()方法获取Socket对象。如果有客户端访问,则该方法执行,得到一个Socket。如果没有客户端访         问,就一直等待。
 4     Socket s = ss.accept();    
 5     //接收“客户端”发送过来的数据
 6     InputStream is = s.getInputStream();
 7     byte[] bys = new byte[1024];
 8     int len = is.read(bys);
 9     System.out.println(new String(bys,0,len));
10 
11     //向“客户端”发送数据    
12     OutputStream os = s.getOutputStream();
13       os.write("hello!!!".getBytes());
14     os.close();
15 
16     s.close();

            DatagramSocket ds = new DatagramSocket(12345);

 

            //2、确定数据,并封装成数据包

 

            //DatagramPacket(byte[] buf,int length,InetAddress address,int port)

 

            byte[] buf = "udp send...".getBytes();

 

            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),10000);

   

            //3、通过Socket服务,将已有的数据包发送出去,通过send方法

 

            ds.send(dp);

            //4、关闭资源

            ds.close();

 

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

 


接收数据         UDPReceive

import java.net.DatagramPacket;

import java.net.DatagramSocket;

澳门正规赌博官方网址, 

/**

 * 需求:定义一个应用程序(Socket),用于接收UDP协议传输的数据并处理

 * 

 * 思路:

 * 1、定义UDPSocket服务,在定义服务的同时,通常会监听一个端口,其实就是给这个专门用于接收数据的网络应用程序定义一个数字标识,也就是端口号,如果不定义,系统会分配一个随机端口号,方便于明确该应用程序可以处理哪些数据。

 * 2、定义一个空数据包,用于存储接收到的数据包,

 * 因为数据包对象中有特有功能可以提取数据包中的不同数据信息

 * 方法:void receive(DatagramPacket)

 * 为什么receive需要接收数据包参数呢?

 * 因为需要操作原地址、目的地址、源端口、目的端口、数据

 * 所以为了方便起见,将所有数据封装成对象进行接收

 * 3、通过Socket服务的receive方法将接收到的数据存入已定义好的数据包中

 * 4、通过数据包对象的特有功能,将这些不同的数据取出,打印到控制台

 * 5、关闭资源。

 * */

public class UdpRece {

    public static void main(String[] args)

{

            try {

                //1、创建udp的socket服务并指定端口,建立接收端点,该服务既可以发送又可以接收

                DatagramSocket ds = new DatagramSocket(10000);

 

                //2、定义数据包,用于存储接收到的数据包

                byte[] buf = new byte[1024];

                DatagramPacket dp = new DatagramPacket(buf,buf.length);

                //3、通过服务的receive方法将接收到的数据存入数据包中

                ds.receive(dp);

                //4、通过数据包的方法获取其中的数据,包含地址、端口和数据

                //因为getAddress()方法返回的是一个对象,所以需要getHostAddress()来获取IP地址

                String ip = dp.getAddress().getHostAddress();

                //因为接收到的数据是一个字节数组,并且不能确定接收到的字节数组长度,所以需要指定长度

                String data = new String(dp.getData(),0,dp.getLength());

                //获取端口

                int port = dp.getPort();

                System.out.println("ip:"+ip+"ndata:"+data+"nport:"+port);

                    ds.close();

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

24小时娱乐5522400,        }
    } 

}


当开启UDPReceive之后,执行UDPSend,控制台输出如下
127.0.0.1...aaa...22222

本文由澳门网络娱乐游戏平台发布于编程,转载请注明出处:24小时娱乐5522400Java程序设计学习笔记(六) — 网络编程

相关阅读