0
点赞
收藏
分享

微信扫一扫

第九章:网络编程

晗韩不普通 2022-04-13 阅读 190

第九章:网络编程

1.网络编程的概述

1.什么是计算机网络:

把分布在不同地理区域的具有独立功能的计算机(各种设备),通过通信设备与线路(网线)连接起来,有功能完善的软件实现资源共享和信息传递系统

2.什么叫网络编程:

我们写的程序可以支持网络通信,实现程序与程序之间互联互通。

java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java本机安装系统里 ,由JVM控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境

3.网络编程的目的:

直接或间接的通过网络协议与其他计算机进行通讯

4.网络编程要素:

如何找到对方主机(电脑):IP

如何可靠高效的进行数据传输:通信协议

2.网络模型

一端与另一端进行网络通信过程中的模型

OSI参考模型:理想中的规范

 

TCP/IP模型:实际中的规范

 

3.网络通信要素:IP,端口号,通信协议

1.IP地址:互联网协议地址 又译为忘记协议地址,网络中的计算机使用IP地址来进行唯一标识(网络中一个计算机地址)

本机回环地址:如127.0.0.1 没网卡的情况下访问本机软件

cmd里输入ipconfig

2.端口号:与计算机上安装的软件有关

一个电脑上安装了许多软件,可以为运营中的程序分配一个端口号

一般访问:

IP(找主机)+端口(找程序)

3.通信协议:就是约定,通信双方如何发送数据,出错了怎么办 速率啊啥的

两个非常著名的传输层协议:

TCP:传输控制协议(客服端与服务端之间的通信协议

UDP:用户数据报协议

4.TCP协议

速度慢 需要建立连接 释放连接

发送前要进行3次握手,确保连接通道是顺畅的

TCP三次握手:

 

 

四次挥手:传输完毕后关闭是一个过程 不是啪的就关闭了 要进行四次挥手

 

5.UDP协议

将数据、源(从哪发出)、目的封装成数据报,不需要建立连接 故不是可靠的 但发送数据结束时无需释放资源,所以速度快。每个数据报大小限制在64K

 

6.java支持TCP和UDP通信协议的实现类

Socket是基于TCP协议的

客户端:

package feifan;

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

public class Wangluokehuduan {
  public static void main(String[] args) throws IOException {
      //客户端Socket,创建时会3次握手建立连接

      Socket socket=new Socket("192.168.223.5",9999);//IP+端口

      OutputStream out=socket.getOutputStream();

      out.write("林书豪".getBytes("utf-8"));
    /*   out.write("加油".getBytes("utf-8"));*/

      InputStream in=socket.getInputStream();
      byte[] b=new byte[100];
      int size=in.read(b);

      String s=new String(b,0,size,"utf-8");
      System.out.println(s);


  }
}

服务端:

package feifan;

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

public class Wangluofuwuduan {
  public static void main(String[] args) throws IOException {
      //客户端与服务器连接

      //建立服务器
      ServerSocket serverSocket=new ServerSocket(9999);//端口在0-65535之间 不能使用已存在的端口
      System.out.println("服务器启动了");
      Socket socket=serverSocket.accept();//监听 有没有客服端尝试连接服务器 一直就在监听
      System.out.println("客户端连接成功");


      InputStream in= socket.getInputStream();
      OutputStream out=socket.getOutputStream();
      byte[] b=new byte[100];
      int size=in.read(b);
      //byte数组如何转换成字符串
String s=new String(b,0,size,"utf-8");
      System.out.println(s);

      //回消息

      out.write("团子".getBytes("utf-8"));

  }
}

 

 

客户端和服务端一来一回聊天:要建立连接 先启动服务端 再启动客户端

客户端:

package feifan;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class client {
  //客户端
  public static void main(String[] args) throws IOException {

      Socket socket=new Socket("192.168.242.5",9999);//IP+端口
      DataInputStream datain=new DataInputStream(socket.getInputStream());
      DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());
      Scanner scanner=new Scanner(System.in);
      while (true){

          System.out.println("客户端说:");//发消息
          String s=scanner.next();
          dataout.writeUTF(s);
          if (s.equals("886")){
              break;
          }


//接收服务器的消息 然后输出

          System.out.println("服务器说:"+datain.readUTF());
      }
socket.close();
      datain.close();
      dataout.close();
  }
}

服务端:

package feifan;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class server {
  //服务端
  public static void main(String[] args) throws IOException {


      ServerSocket serverSocket=new ServerSocket(9999);//端口
      Socket socket=serverSocket.accept();//监听
      DataInputStream datain=new DataInputStream(socket.getInputStream());
      DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());

      Scanner scanner=new Scanner(System.in);
      while (true){

          System.out.println("客户端说:"+datain.readUTF());//接收完了输出

          System.out.println("服务器说:");//回消息
          String ss=scanner.next();
          dataout.writeUTF(ss);



      }
  }
}

7.UDP协议实现类

没有服务的概念 就只有发送端和接收端 不需要建立连接

·类DatagramSocket与DatagramPacket实现了基于UDP协议网络程序。

·数据报通过DatagramSocket发送和接收,不保证一定送达,何时送达

·DatagramPacket对象封装了UDP数据报,数据报中包含了发送端和接收端的IP地址和端口号 所以不需要建立连接

流程:

1.DatagramSocket与DatagramPacket

2.建立发送端和接收端(是两个独立程序)

3.建立数据报

4.调用Socket的发送、接收方法

5.关闭Socket

 

 

发送端:

package feifan;

import java.io.IOException;
import java.net.*;

public class send {
  public static void main(String[] args) throws IOException {
      //发送端

      DatagramSocket datagramSocket=new DatagramSocket();//DatagramSocket既可以发送 也可以接收 不需要端口 数据报里有

    byte[] b="季后赛".getBytes();
    //创建数据报   封装数据
      while (true){//一直发
          DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("192.168.242.5"),9999);//数据报
          datagramSocket.send(datagramPacket);

      }
  }
}

接收端:

 
package feifan;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class receive {
  public static void main(String[] args) throws IOException {

      //接受信息
      DatagramSocket datagramSocket=new DatagramSocket(9999);
      byte[] b=new byte[1024];
while (true){//一直接

  DatagramPacket datagramPacket=new DatagramPacket(b,b.length);//传进去一个数组 还有数组长度
  datagramSocket.receive(datagramPacket);//接受数据到数据报中
  String s=new String(b,0,datagramPacket.getLength());//实际长度
  System.out.println(s);

}
  }
}



举报

相关推荐

0 条评论