网络编程

一. 网络常识

  1. 什么是计算机网络

    分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统。计算机网络, 可以很方便的进行 信息的传递, 资源的共享 。

  2. 什么是计算机的IP地址

    IP地址 是计算机在互联网中的唯一标识,就像人在社会中的身份证号码。

    本机IP:

     127.0.0.1

     localhost

  3. 什么是网络中网站的域名

    域名可以简单的理解为IP地址的别名,更方便记忆,当输入域名后(例如www.baidu.com),计算机会访问域名解析商,然后得到ip地址,再进行访问。

  4. 什么是计算机的端口号

   (1)端口号的范围 0-65535 之间。

   (2)与ip地址很相似,IP地址是计算机在网络中的唯一标识。端口号是计算机中 程序的标识,用于在一台计算机中区分不同的应用程序。

   (3)端口号在使用时,应尽量避免0-1024之间的端口号,因为已经被一些知名的软件和windows操作系统所占用了。

  5. 什么是计算机之间的通信协议

    是计算机与计算机之间交流的标准;是对数据的传输速率,传入接口,步骤控制出错控制等等制定的一套标准。

    常用的通信协议:

     (1)http协议:超文本传输协议。80端口号

     (2)https协议:安全的超文本传输协议。443端口号

     (3)ftp协议:文件传输协议。21端口号

     (4)TCP协议:传输控制协议

     (5)UDP协议:数据报协议

二. 网络编程程序的分类

  1. B/S 程序:浏览器与服务器程序。

  2. C/S 程序:客户端与服务器程序。

三. TCP协议 - OSI网络模型

  指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程。

  七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层

四. 三次握手

  tcp协议客户端与服务器连接时,存在三次握手操作,确保消息能准确无误的发送。

  三次握手:

    第一次握手,客户端向服务器发出连接请求,等待服务器确认

    第二次握手,服务器向客户端发送一个响应,通知客户端收到了连接请求。

    第三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。

  由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛

  断开连接时 , 存在四次挥手操作。

五. TCP协议的C/S程序

  需要使用到两个类,来编写TCP协议的CS程序。

  1. ServerSocket 搭建服务器

  2. Socket 搭建客户端

  两方使用socket(套接字,通信端点) 进行交流

六. ServerSocket

  用于创建服务器。创建完毕后,会绑定一个端口号。然后此服务器可以等待客户端连接。每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户端进行通信。

  1. 常用构造方法:

   ServerSocket(int port);

   创建一个基于TCP/IP协议的服务器,并绑定指定的端口号。

   注意: 参数port的范围是: 0-65535(建议1025-65535)

  2. 常用方法:

   Socket accept();

    等待客户端连接,此方法会导致线程的阻塞,直到一个新的客户端连接成功,return Socket对象后,线程再继续执行。

   void close();

    释放占用的端口号,关闭服务器。

七. Socket

  是两台计算机之间通信的端点,是网络驱动提供给应用程序编程的一种接口 一套标准,一种机制。

  1. 构造方法:

   Socket(String ip,int port)

    创建一个套接字,并连接指定ip和端口号的服务器。

    参数1. 服务器的ip地址

    参数2. 服务器软件的端口号

  2. 常用方法:

   OutputStream getOutputStream();

    返回的是指向通信的另一端点的输出流

   InputStream getInputStream();

    返回的是指向通信的另一端点的输入流

   void close();

    关闭套接字

   注意:

    在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的。

    客户端的输入流,输入的是服务器的输出流,输出的内容;客户端的输出流,输出到了服务器的输入流中。

    所以 在使用时,需要注意以下一点规则:

      客户端与服务器获取流的顺序必须是相反的

      例如:客户端先得到了输入流,那服务器必须先获取输出流。

八. 案例

  客户端:

   //1. 连接服务器
   Socket socket = new Socket("192.168.102.228",8888);

   //2. 得到输出流
   //2.1 得到输出流
   OutputStream os = socket.getOutputStream();

   //2.2 将输出流, 转换为打印流
   PrintStream ps = new PrintStream(os);

   //3. 得到输入流
   //3.1 得到输入流
   InputStream is = socket.getInputStream();

   //3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流

   InputStreamReader isr = new InputStreamReader(is);
   BufferedReader br = new BufferedReader(isr);   

   //4. 循环接收用户输入
   Scanner input = new Scanner(System.in);
   while(true) {
    System.out.println("请输入要发送给服务器的内容:");
    String text1 = input.nextLine();

    //5. 将用户输入的内容, 发送给服务器
    ps.println(text1);

    //6. 接收服务器回复的消息
    String text2 = br.readLine();
    System.out.println(text2);
    if("886".equals(text1)) {
     break;
    }
   }

  服务器:

   public static void main(String[] args) throws Exception {
    //1. 启动服务器, 并侦听8888端口号
    ServerSocket server = new ServerSocket(8888);

    //2. 打印提示
    System.out.println("服务器已启动 , 等待客户端连接中...");

    //3. 等待客户端连接
    Socket socket = server.accept();
    System.out.println("一个客户端连接成功:"+socket.getInetAddress().toString());

    //4. 获取输入流
    //4.1 获取输入流
    InputStream is = socket.getInputStream();

    //4.2 将输入的字节流 ,转换为字符流
    InputStreamReader isr = new InputStreamReader(is);

    //4.3 将字符流, 转换为逐行读取流
    BufferedReader br = new BufferedReader(isr);

    //5. 获取输出流
    //5.1 获取输出流
    OutputStream os = socket.getOutputStream();

    //5.2 将字节输出流, 转换为打印流
    PrintStream ps = new PrintStream(os);
    while(true) {

     //6. 循环读取一行行的数据 ,读取操作会导致线程的阻塞, 直到客户端真的发送了数据,
     //服务器才能接到, 顺序继续执行下面的代码
     String text = br.readLine();

     //7. 将这个文字, 再打印给客户端
     ps.println("服务器:"+text);
     if("886".equals(text)) {
      break;
     }
    }

posted @   Luo_YB  阅读(91)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示