网络编程

时间:2021-6-19 作者:qvyue

第一章 网络编程入门

1.1 软件结构

  • C/S结构:客户端和服务器结构,常见的有:QQ、迅雷等软件
  • B/S结构:浏览器和服务器结构,常见的有:谷歌、火狐等

1.2网络通信协议

  • 网络通信协议
  • TCP/IP协议:传输控制协议/因特网互联协议。四层模型(应用层、传输层、网络层、数据链路层和物理层)

1.3协议分类:

  • UDP:用户数据报协议。面向无连接的通信协议,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同样接收端在收到数据时,也不会向发送端反馈是否接收到数据。
    优点:消耗资源小,通信效率高,通常用于音频、视频和普通数据的传输。
    缺点:不能保证数据的完整性,偶尔会丢失少量数据包。
  • TCP:传输控制协议。面向连接的通信协议,传输数据前,先建立逻辑连接,再传输数据,提供了两台计算机间可靠的无差错的数据传输。
    在TCP连接中必须要明确客户端与服务器,由客户端发送连接请求,每次连接的创建都要经过“三次握手”。保证数据传输安全。
  • 三次握手
    1、第一次握手:客户端向服务器发送连接请求,等待服务器确认。
    2、第二次握手:服务器向客户端回送一个响应。通知客户端收到了连接请求。
    3、第三次握手:客户端再次向服务器发送确认信息,确认连接。

1.4网络编程三要素

①协议
②IP地址

  • ipv4 32位的二进制数,通常被分为四个字节,可以表示2^32≈42亿个
  • ipv6 128位的十六进制数,每16个字节一组,分成8组,可以表示16^128个
    特殊的IP地址:127.0.0.1、localhost

③端口号

  • 是一个逻辑端口,无法直接看到。由两个字节组成,取值范围在0-65535之间
    注意
    1、1024之前的端口号已经不能使用了,被系统分配到已知的网络软件了
    2、端口号不能重复
  • 使用IP+端口号就能保证数据准确无误地发送到对方计算机的指定软件上了
    常见的端口号:
    1、80端口 网络端口 如:www.baidu.com:80
    2、数据库 mysql:3306 oracle:1521
    3、Tomcat服务器:8080

第二章:TCP通信程序

2.1概述

两端通信步骤:
1、服务端程序,需要事先启动,等待客户端的连接
2、客户端主动连接服务器端,连接成功才能实现通信。服务端不可以主动连接客户端。

在Java中,提供了两个类来实现TCP通信程序
1、客户端:java.net.Socket类表示,创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
2、服务端:java.net.ServerSocket类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。

2.2 Socket类

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 构造方法
public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指 定的host是null ,则相当于指定地址为回送地址。
例如:

Socket client = new Socket("127.0.0.1", 6666);

成员方法包括:getInputStream、getOutputStream、close、shutdownOutput.

具体实现:
客户端类:

package com.silencoco._NET;

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

public class TCPClient {
    public static void main(String[] args) throws IOException {
        /**
         * 设置IP、端口号
         * 使用socket中的getOutputStream方法获取os对象
         * 使用outputStream中的write给服务器发送数据
         *
         * getInputStream获取,read读取
         * 释放资源
         */
        Socket socket = new Socket("127.0.0.1",8888);
//        socket.getOutputStream().write(Integer.parseInt("向服务器发送数据..."));
        OutputStream os = socket.getOutputStream();
        os.write("客户端发出请求".getBytes());
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.printf(new String(bytes,0,len));

        socket.close();
    }

}

服务器类:

package com.silencoco._NET;

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

/**
 * 创建ServerSocket对象,指定端口号,
 * 使用ServerSocket对象中的accept获取到请求的客户端对象Socket
 * 使用socket对象中国年的getInputStream获取输入流
 * read读取
 * 在用socket.getOutputStream write 回写数据
 * close
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.printf(new String(bytes,0,len));
        OutputStream os = socket.getOutputStream();
        os.write("服务器收到请求并响应".getBytes());

        serverSocket.close();
        socket.close();
    }
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。