day13-网络编程

网络编程

  • 网络三要素

    • ip
      • 网络设备的唯一标识。 【电脑、手机…】
    • 端口
      • 程序的唯一标识
    • 协议
      • 数据传输的规则
  • udp通信

    • 特点

      • 无连接,不可靠通信
    • 接收端

      • 流程

        • 先创建一个接收端,【一定要指定端口】
        • 准备数据包
        • 接收数据
      • 方法

        • \1. DatagramSocket socket = new DatagramSocket(端口);

        • 2.DatagramPacket(字节数组, 数组长度 )

        • \3. 调用 DatagramSocket的receive(数据包)

        • 4.调用DatagramPacket的getLength()获取接收到的数据的长度

          package com.itheima.demo02_udp相互发送数据;
          
          import java.net.*;
          
          public class Receiver {
              public static void main(String[] args) throws Exception {
                  // 1.先创建一个接收端
                  DatagramSocket receiver = new DatagramSocket(9526);
                  // 2.准备一个数据包,用于存放接收的数据
                  while (true) {
                      SocketAddress remoteSocketAddress = receiver.getRemoteSocketAddress();
                      System.out.println(remoteSocketAddress);
                      byte[] bytes = new byte[1024 * 8];
                      DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length);
                      // 3.接收数据
                      receiver.receive(packet1);
                      String s = new String(bytes , 0 , packet1.getLength());
                      System.out.println("接收端接收到的数据是:" + s);
          
                      // ----4.---- 我们需要发送数据
                      // 5.创建一个数据包
                      byte[] bytes1 = "我很好,你呢?".getBytes();
                      DatagramPacket packet2 = new DatagramPacket(bytes1 , bytes1.length , InetAddress.getByName("127.0.0.1"),9527);
                      // 6.发送数据
                      receiver.send(packet2);
                      System.out.println("发送成功~");
                  }
              }
          }
          
          
    • 发送端

      • 流程

        • 先创建一个发送端 【端口可指定,可不指定】
        • 准备数据包
        • 发送数据
      • 方法

        • \1. DatagramSocket socket = new DatagramSocket(端口);

        • 2.DatagramPacket(内容字节数组, 数组长度 ,接收端的ip, 接收端的端口 )

        • \3. 调用 DatagramSocket的send(数据包)

          package com.itheima.demo02_udp相互发送数据;
          
          import java.net.DatagramPacket;
          import java.net.DatagramSocket;
          import java.net.InetAddress;
          import java.net.SocketException;
          
          public class Sender {
              public static void main(String[] args) throws Exception {
                  // 1. 先创建一个发送端 ==> 这里需要发送数据,也要接收数据
                  DatagramSocket sender = new DatagramSocket(9527);
          
                  // 2.创建一个数据包
                  while (true) {
                      byte[] bytes = "小明,你好吗?".getBytes();
                      DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 9526);
                      // 3.发送数据
                      sender.send(packet1);
                      System.out.println("发送数据成功~");
          
                      // ---4.我们需要接收数据
                      // 5.我们需要创建一个新的数据包,用于接收数据
                      byte[] bytes2 = new byte[1024 * 8];
                      DatagramPacket packet2 = new DatagramPacket(bytes2 , bytes2.length);
                      // 6.调用receiver的方法接收数据
                      sender.receive(packet2);
                      String s = new String(bytes2 , 0 , packet2.getLength());
                      System.out.println("接收到的数据是:" + s);
                  }
          
          
              }
          }
          
          
  • tcp 通信

    • 特点

      • 面向连接,可靠通信
    • 客户端

      • Socket s = new Socket(对方ip, 端口)

      • 获取输入流

        • getInputStream()
      • 获取输出流

        • getoutputStream()

          package com.itheima.demo04_tcp相互发送数据;
          
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.net.Socket;
          import java.util.Scanner;
          
          public class Client {
              public static void main(String[] args) throws Exception {
                  // 1.创建一个 Socket
                  Socket socket = new Socket("127.0.0.1", 9527);
                  // 2.创建键盘录入对象,录入一段内容
                  Scanner sc = new Scanner(System.in);
                  System.out.println("请输入一段发送给服务端的内容:");
                  String s = sc.next();
                  // 3.要从socket里面去获取一个输出流,把上面的内容写出去
                  OutputStream os = socket.getOutputStream();
                  os.write(s.getBytes());
          
          
                  // 4.------接收服务端发送过来的数据
                  // 5.从socket里面获取一个输入流
                  InputStream is = socket.getInputStream();
                  // 6.读取数据
                  byte[] bytes = new byte[1024 * 8];
                  int length = is.read(bytes);
                  System.out.println("接收到了服务器发送过来的数据:" + new String(bytes, 0, length));
          
                  is.close();
                  os.close();
                  socket.close();
          
              }
          }
          
          
    • 服务端

      • ServerSocket server = new ServerSocket(端口)
      • 接收连接方法
        • Socket accept()
package com.itheima.demo04_tcp相互发送数据;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        // 1.创建一个服务器对象
        ServerSocket server = new ServerSocket(9527);
        // 2.接收对方的socket
        Socket socket = server.accept();
        // 3.从socket里面获取输入流,读取对方发送过来的数据
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024 * 8];
        int length = is.read(bytes);
        System.out.println("接收到了小黑子发送过来的数据:" + new String(bytes, 0, length));

        // 4.从socket里面获取输出流,把一段信息写过去
        OutputStream os = socket.getOutputStream();

        os.write("小黑子你好,我收到了你的消息~over".getBytes());

        // 5.关流
        os.close();
        is.close();
        socket.close();
        server.close();

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值