一.网络编程概述

  • 什么是网络?

    • 在计算机领域中,网络是信息传输、接收、共享的虚拟平台
  • 什么是网络编程?

    • 通过操作相应API调度计算机硬件资源,并利用传输管道(网线)进行数据交换的过程
  • 7层网络模型

    • 基础层:物理层(Physical)、数据链路层(Datalink)、网络层(Network)
    • 传输层:TCP-UDP协议层、Socket
    • 高级层:会话层(Session)、表示层(Presentation)、应用层(Application)

二.Socket与TCP、UDP

  • 什么是Socket

    • 是IP地址与端口的结合协议(RFC 793)
    • 一种地址与端口的结合描述协议
    • TCP/IP协议的相关API总称,是网络API的集合实现
  • Socket的作用与组成

    • 在网络传输中用于唯一标识两个端点之间的连接
    • 端点:IP+Port
    • 4个要素:客户端地址、客户端端口、服务器地址、服务器端口
  • Socket——TCP

    • TCP是面向连接的通信协议
    • 通过三次握手建立连接,通讯完成时拆除连接
    • 只能用于端到端的通讯
  • Socket——UDP

    • UDP是面向无连接的通讯协议
    • UDP数据包括目的端口号和源端口号信息
    • 该通讯不需要连接,可以实现广播发送,不局限于端到端
  • Client-Server Application

    • TCP/IP协议中,两个进程间通信的主要模式为 CS模型
    • 目的:协同网络中计算机资源、服务模式、进程间数据共享

三.Socket TCP-客户端和服务端简单实现

  • 客户端(Client)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class Client {

    public static void main(String[] args) throws IOException {
    //初始化Socket
    Socket socket = new Socket();
    //超时时间
    socket.setSoTimeout(3000);

    //连接本地,端口2000,超时时间3000毫秒
    socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);

    System.out.println("已发起服务器连接,并进入后续流程");
    System.out.println("客户端信息:"+socket.getLocalAddress()+"P:"+socket.getLocalPort());
    System.out.println("服务器信息:"+socket.getInetAddress()+"P:"+socket.getPort());

    try {
    //发送接收数据
    todo(socket);
    }catch (Exception e){
    e.printStackTrace();
    }

    socket.close();
    System.out.println("客户端已退出...");

    }

    private static void todo(Socket client) throws IOException{
    //构建键盘输入流
    InputStream in = System.in;
    BufferedReader input = new BufferedReader(new InputStreamReader(in));
    //得到Socket输出流,并转换为打印流
    OutputStream outputStream = client.getOutputStream();
    PrintStream socketPrintStream = new PrintStream(outputStream);

    //得到Socket输入流
    InputStream inputStream = client.getInputStream();
    //并转换为BufferedReader
    BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

    boolean flag = true;
    do{
    //键盘读取一行
    String str = input.readLine();
    //发送到服务器
    socketPrintStream.println(str);

    //从服务器读取一行
    String echo = socketBufferedReader.readLine();
    if("bye".equalsIgnoreCase(echo)){
    flag = false;
    }else {
    System.out.println(echo);
    }
    }while (flag);

    //资源释放
    socketPrintStream.close();
    socketBufferedReader.close();
    }
    }

  • 服务器端(Server)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class Server {

    public static void main(String[] args) throws IOException {
    //没指定IP地址默认本机,若要指定ip可以参考下面注释的bind方法
    ServerSocket server = new ServerSocket(2000);
    //server.bind(new InetSocketAddress("192.168.1.104",2000));
    System.out.println("服务器准备就绪...");
    System.out.println("服务器信息:"+server.getInetAddress()+"P:"+server.getLocalPort());

    //等待客户端连接
    for(;;){
    //得到客户端连接
    Socket client = server.accept();
    //客户端构建异步过程
    ClientHandler clientHandler = new ClientHandler(client);
    //启动线程
    clientHandler.start();
    }

    }

    /**
    * 客户端消息处理
    */
    private static class ClientHandler extends Thread{

    private Socket socket;
    private boolean flag = true;

    public ClientHandler(Socket socket){
    this.socket = socket;
    }

    public void run(){
    super.run();
    System.out.println("新客户端连接了:"+socket.getInetAddress()+"P:"+socket.getPort());

    try {
    //得到打印流,用于数据输出;服务器回送数据
    PrintStream socketOutput = new PrintStream(socket.getOutputStream());
    BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    do{
    //从客户端拿一条数据
    String str = socketInput.readLine();
    if("bye".equalsIgnoreCase(str)){
    flag=false;
    //回送
    socketOutput.println("bye");
    }else {
    //打印到屏幕,回送数据长度
    System.out.println(str);
    socketOutput.println("回送:"+str.length());
    }

    }while (flag);

    //关闭输入输出流
    socketInput.close();
    socketOutput.close();

    }catch (Exception e){
    e.printStackTrace();
    } finally {
    try {
    socket.close();
    System.out.println("客户端已退出");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }

四.报文、协议、Mac地址

报文

  • 报文段是指TCP/IP协议网络传输过程中,起着路由导航作用
  • 用于查询各个网络路由段、IP地址、交换协议等IP数据包
  • 报文在传输过程中会不断地封装成分组、包、帧来传输

传输协议

  • 协议是一种规定,约束
  • 约定大于配置,网络传输流程是稳定的,得益于基础的协议构成
  • 相互传输的数据都能相互识别

Mac地址

  • Media Access Control
  • 物理地址、硬件地址
  • 用来定义网络设备的位置

五.IP、端口、远程服务器

IP

  • Internet Protocol Address(互联网协议地址)
  • 是分配给网络上使用网际协议的设备的数字标签
  • 常见的IP地址分为IPv4与IPv6两大类
  • IP地址由32位二进制数组成,以XXX.XXX.XXX.XXX形式表示(每组XXX代表<=255的十进制数)

端口

  • 若把IP地址比作一间房子,端口就是这间房子的门或窗户
  • 0到1023以及1024到49151为特殊端口
  • 计算机间依照互联网传输层TCP/IP协议通信,不同协议对应不同端口
  • 49152到65535为动态端口

远程服务器

  • 具备公网IP
  • 能够将多台电脑连接在一起,并进行数据交换

  • 下一篇文章推荐:Socket网络编程进阶之UDP,更加深入学习Socket编程,最后实现聊天室项目!