A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-26 14:17 编辑

JavaEE网络编程笔记

Day_12网络编程与协议  
      创建发送端Socket对象
      创建数据并打包
      发送数据
      释放资源
  • 网络编程

    • 让不同计算机上运行的程序可以通过网络进行数据交换


  • Socket: 中文名译为套接字

    • 不是协议,而是对协议的封装,提供了编程规范接口,让程序员可以通过它来实现相关网络协议
    • 用于描述IP地址和端口,是一种网络编程机制,通信的两端,不管是发送方还是接收方都需要有Socket
    • 计算机上一般会有多个服务程序,每个服务程序会使用多个Socke进行网络通信,每个Socket会绑定到一个端口上,网络通信就是Socket之间的通信,数据在两个Socket之间通过IO流进行传输



  • 网络编程中分为两种协议        
  • UDP协议和TCP协议
    ​UPDP协议发送接收数据                        


发送数据                  
  
  /*
   * // 1. 为发送端创建Socket对象(DatagramSocket)
      DatagramSocket datagramSocket = new DatagramSocket();
      
      // 2. 创建数据并打包
      DatagramPacket datagramPacket = new DatagramPacket(byte数组, 数组长度, InetAddress对象, 端口号);
      
      // 3. 发送数据
      datagramSocket.send(datagramPacket);
      
      // 4. 释放资源
      datagramSocket.close();
   */
  ​
  public class SendDemo {
      public static void main(String[] args) throws IOException {
          // 先创建 DatagramSocket对象
          DatagramSocket ds = new DatagramSocket();
  ​
          // 创建一个空包来存放数据 ,并且要给包指定地址,要发送的东西和发多少,端口号
          String s = "这是UDP";
          // 将字符串转换成字节数组
          byte[] by = s.getBytes();
          DatagramPacket dp = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.1.116"), 8870);
         
          ds.send(dp);
          // 关闭资源
          ds.close();
      }
  }
//接收数据
  
  ​
       * 接收 本地主机 发送过来
          ”Hello,I am comming”
          利用DatagramSocket和DatagramPacket完成
          接收端,并打印发送过来的数据
      
  ​
       */
  public class ReceiveDemo {
      // public static void main(String[] args) throws IOException {
      // // 创建接收端接收端口号
      // DatagramSocket ds = new DatagramSocket(8870);
      // // 创建空包接收
      // byte[] by = new byte[1024];
      // DatagramPacket packet = new DatagramPacket(by, by.length);
      // // 接收数据
      // ds.receive(packet);
      //
      // // 解析数据
      // // 获取了Ip地址
      // InetAddress address = packet.getAddress();
      // // 将获取到的字符数组解析
      // byte[] data = packet.getData();
      // // 接收多少,我们就输出多少
      // String msg = new String(data, 0, packet.getLength());
      //
      // System.out.println("[" + address + "]发来消息:" + msg);
      //
      // // 关闭数据
      // ds.close();
      //
      // }
      public static void main(String[] args) throws IOException {
          // 创建协议对象接收定义的端口号
          DatagramSocket dp = new DatagramSocket(8870);
          // 创建一个空包来接收
          byte[] by = new byte[1024];
          DatagramPacket dg = new DatagramPacket(by, by.length);
          // 接收数据
          dp.receive(dg);
          //解析数据
          //第一步先获取到数据
          byte[] data=dg.getData();
         
          String str=new String(data,0,dg.getLength());
          System.out.println("我收到你发送的数据了:"+str+"\t原来你是"+dg.getAddress().getHostName());      
      }
  }
  ​TCP协议发送数据
  • java.net.Socket类: 基于TCP协议的Socket, 作为客户端

    • 构造方法

      • Socket(InetAddress add, int port): 创建TCP客户端对象


    • 成员方法

      • OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
      • InputStream getInputStream(): 获取输入流, 用于接收数据
      • void close(): 释放资源



  • TCP发送数据步骤


  
  // 1. 创建客户端Socket对象(建立连接)
  Socket socket = new Socket(InetAddress地址, 端口号);
  // 2. 获取输出流对象
  OutputStream outputStream = socket.getOutputStream();
  // 3. 发送数据
  outputStream.write(byte数组);
  // 4. 释放资源
  socket.close();
  • 连接失败异常:

    • ConnectException: Connection refused: connect: 连接被拒绝, 无法创建连接. 一般是因为网络不通, IP地址不存在等导致无法连接
    • 解决办法:

      • 确认必须有接收端, 且可以连接




TCP协议接收数据
  • java.net.ServerSocket: TCP服务端

    • 构造方法

      • ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口


    • 成员方法

      • Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
      • void close(): 关闭Socket






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马