网络编程笔记

网络编程

什么是网络编程?

  • 通过我们写好的程序,能够实现数据在互联网中进行传输

  • 也叫Socket编程,套接字编程

网络编程三要素?

  • IP地址

    代表计算机的唯一标识

    查看IP地址:ipconfig -all

  • 端口号

    所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。

    端口号代表应用程序的唯一标识

  • 协议

    计算机双方必须共同遵守的一组约定。

    TCP UDP 网络通信协议

InetAddress类

此类表示互联网协议(IP)地址。

常见成员方法:

  • getByName(String host)

      //通过传递主机的名字或者IP地址,来获取InetAddress对象
      public static void main(String[] args) throws IOException {
              InetAddress inetAddress = InetAddress.getByName("计算机名称/IP地址"); //java.net.Inet4Address
          }
      }
  • getHostAddress():获取IP地址

      
      System.out.println(inetAddress.getHostAddress());
  • getHostName() :获取主机名称(InetAddress.getByName()传的是什么就是什么)

      
      System.out.println(inetAddress.getHostName());

在UDP协议下进行数据的传输

UDP协议的特点:

  • 面向无连接

  • 传输速度较快

  • 传输数据不安全(相对TCP),数据容易丢失

发送端:

​ 实现步骤:

  1. 创建Socket对象(创建码头)

      
      DatagramSocket datagramSocket = new DatagramSocket();
  2. 写数据(拿货物)

      
      String data = "itxiaoli";
  3. 创建数据报包对象,将写好的数据封装到里面(创建集装箱,将货物装进去)

    货物是什么?(第一个参数:数据)

    货物有多大?(第二个参数:数据的长度)

    发到哪个国家?(第三个参数:IP地址)

    发到哪个城市的哪个小区?(第四个参数:端口号)

      
      DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.getBytes().length, InetAddress.getByName("127.0.0.1"),8000);
  4. 发送数据(发货)

      
      datagramSocket.send(datagramPacket);
  5. 释放资源(关码头)

      
      datagramSocket.close();

接收端:

​ 实现步骤:

  1. 创建Socket对象(创建码头)

  2. 创建数据报包对象(创建集装箱)

  3. 接收数据(接受货物)

  4. 解析数据(拆箱验货)

  5. 关闭资源(关码头)

      
      //        1. 创建Socket对象(创建码头)
              DatagramSocket ds = new DatagramSocket(8000);
      //        2. 创建数据报包对象(创建集装箱)
              byte[] bytes = new byte[1024];
              DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
      //        3. 接收数据(接受货物)
              ds.receive(dp);
      //        4. 解析数据(拆箱验货)
              String ip = dp.getAddress().getHostAddress();//获取该货物从哪里来的
              String data = new String(bytes,0,dp.getLength());//获取数据
              System.out.println(ip+"~~~~"+data);
      //        5. 关闭资源(关码头)
              ds.close();

*在TCP协议下进行数据的传输

TCP协议的特点:

  1. 面向有连接

  2. 传输数据较慢

  3. 传输数据较(UDP)安全

实现步骤:

发送端:

  1. 创建Socket对象

      
      Socket s = new Socket("123.453.654.1",12345);
  2. 写数据

      
      String data  = "itxiaoli";
  3. 获取管道从输出流对象

      
      OutputString os = s.getOutputStream();
  4. 写出数据

      
      os.write(data.getBytes());
  5. 数据资源

      
      s.close(); 

接收端:

  1. 创建Socket对象

      
      ServerSocket serverSocket = new ServerSocket(12345);
  2. 监听连接

      
      Socket accept = serverSocket.accept();
  3. 获取管道输入流对象

      
      InputStream inputStream = accept.getInputStream();
  4. 读取数据

      
      byte[] b = new byte[1024];
      int len = inputStream.read(b);
      String data = new String(b,0,len);
      System.out.println(data);
  5. 释放资源

      
      serverSocket.close();//断开连接
      accept.close();//关闭码头

发送一个对象:

创建Person对象

  package com.itxiaoli.TCP;
  ​
  import java.io.Serializable;
  ​
  public class Person implements Serializable {
      private String name;
      private int age;
  ​
      public Person() {
      }
  ​
      @Override
      public String toString() {
          return "Person{" +
                  "name='" + name + '\'' +
                  ", age=" + age +
                  '}';
      }
  ​
      public String getName() {
          return name;
      }
  ​
      public void setName(String name) {
          this.name = name;
      }
  ​
      public int getAge() {
          return age;
      }
  ​
      public void setAge(int age) {
          this.age = age;
      }
  ​
      public Person(String name, int age) {
          this.name = name;
          this.age = age;
      }
  }

Receive

  
  package com.itxiaoli.TCP;
  ​
  import java.io.ObjectInputStream;
  import java.net.ServerSocket;
  import java.net.Socket;
  ​
  public class Service_1 {
      public static void main(String[] args) throws Exception{
          //创建Socket对象
          ServerSocket ss = new ServerSocket(12315);
  ​
          //监听连接
          Socket s = ss.accept();
  ​
          //获取输入管道流对象
          ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
  ​
          //读取数据
          Person p= (Person) ois.readObject();
          System.out.println(p.getName()+p.getAge());
  ​
          //释放资源
          s.close();
          ss.close();
      }
  }

Send

  
  package com.itxiaoli.TCP;
  ​
  import java.io.ObjectOutputStream;
  import java.net.Socket;
  ​
  public class Send_1 {
      public static void main(String[] args) throws Exception{
          //创建Socket对象
          Socket s = new Socket("132.456.78.3",12315);
  ​
          //写数据
          Person p = new Person("itxiaoli",12);
  ​
          //获取管道输出流对象
          ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
  ​
          //写数据
          oos.writeObject(p);
  ​
          //释放资源
          s.close();
      }
  }

包装成字符流

  
  //获取管道输出流对象
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  ​
  //写数据
  bw.write(data);
  ​
  //刷新
  bw.flush();
  ​
  //获取管道输入流对象
  BufferedReader br = new BufferedReader(new InpuStreamReader(s.getInputStream()));
  ​
  //读取数据,一次读取一行
  String data = br.readLine();

双向传输:

Send:

  
  package com.itxiaoli.TCP;
  ​
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.net.Socket;
  ​
  public class Send_2 {
      public static void main(String[] args) throws Exception {
          Socket s = new Socket("192.168.1.1",9090);
          String data = "123";
          //发送
          OutputStream os = s.getOutputStream();
          os.write(data.getBytes());
          //接收
          InputStream is = s.getInputStream();
          byte[] b = new byte[1024];
          int len = is.read(b);
          String data1 = new String(b,0,len);
          System.out.println(data1);
  ​
          s.close();
      }
  }

Receive:

  
  package com.itxiaoli.TCP;
  ​
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.net.ServerSocket;
  import java.net.Socket;
  ​
  public class Receive_2 {
      public static void main(String[] args) throws Exception {
          ServerSocket ss = new ServerSocket(9090);
          Socket s = ss.accept();
  ​
          //接收
          InputStream is = s.getInputStream();
          byte[] b = new byte[1024];
          int len = is.read(b);
          String data = new String(b,0,len);
          System.out.println(data);
  ​
          //发送
          OutputStream os = s.getOutputStream();
          os.write("hhhhh".getBytes());
  ​
          s.close();
          ss.close();
      }
  }

服务器数据写入文本文件

  
  public class Receive_3 {
      public static void main(String[] args) throws Exception{
  //        创建Socket对象
          ServerSocket ss = new ServerSocket(12312);
  ​
  //        监听
          Socket s = ss.accept();
  ​
  //        获取输入流对象
          BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  ​
  //        创建高效字符输出流对象
          BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
  ​
  //        一次读一行
          String line = null;
          while ((line = br.readLine() )!=null ){
              bw.write(line);
              bw.newLine();
              bw.flush();
          }
  ​
  //        释放资源
          bw.close();
          s.close();
          ss.close();
      }
  }

服务器数据读取文本文件

  
  public static void main(String[] args) throws Exception{
          //创建Socket对象
          Socket s = new Socket("192.168.123.1",12312);
  ​
          //创建高效出入流对象
          BufferedReader br = new BufferedReader(new FileReader("a.txt"));
  ​
          //管道输出流
          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  ​
          //读取一行
          // 写一行
          String line = null;
          while ((line =br.readLine()) != null){
              bw.write(line);
              bw.newLine();;
              bw.flush();
          }
  ​
  //      释放资源
          s.close();
          br.close();
      }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值