网络编程系统化学习(1.1.)--socket基础

  学完该阶段内容,你将会很好的完成如下的面试题

  socket面试试题相关:

  1.写一个简单的socket程序,实现客户端发送数据,服务端收到数据后,将该内容转发给客户端

  2.简要概述一下socket的请求流程

  3.简要概述一下什么是3次握手,为什么需要3次握手

  4.简要概述一下什么是4次挥手,为什么需要4次挥手

  5.简单说一下你对io流的认识

  6.简要说一下TCP/IP的通信模型

  7.简要说一下socket的通信模型

  8.简要说一下OSI通信模型有那7层,tcp协议在那一层?路由选择那一层

  9.简要说一下socket能否传递java对象,怎么传

  10.简要说一下如何实现多个客户端同时连接同一个服务端

  11.socket如何实现多线程传送文件

  12.简要说一下tcp与udp的区别

  13.简要说一下你对io \ bio \ nio \ aio 的认识

1.socket简介

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。

  socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;

  HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

  对于java程序来说,它的实现方式是通过调用网络库(java.net库)的一些API函数来实现分布在不同主机的相关进程之间的数据交换

2.socket hello world

  需求:写一个简单的服务器程序,客户端向服务端发送数据,服务端收到数据后,返回一句:"你好,我已经收到数据".

2.1.两个重要的API介绍

  ServerSocket \ Socket

  API地址:http://blog.fondme.cn:8000/apidoc/jdk-1.8-google/

2.2.服务端设计  

  服务端设计步骤:
  1.创建socket服务端
  serverSocket = new ServerSocket(1001);
  2.监听客户端(是一个阻塞方法)
  server = serverSocket.accept();
  3.获取输入流
  server.getInputStream()
  4.获取输出流
  server.getOutputStream()
  5.关闭资源
  serverSocket.close();

  案例代码:

package com.wfd360.com.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Copyright (C)公众号:java实战分享
 * @Author: 姿势帝-博客园
 * @Date: 2019-09-01 15:14
 * @Description:
 */
public class ServerSocketDemo {
    /**
     * ServerSocket 的构造方法如下所示。
     * ServerSocket():无参构造方法。
     * ServerSocket(int port):创建绑定到特定端口的服务器套接字。
     * ServerSocket(int port,int backlog):使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口。
     * ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、监听 backlog 和要绑定到本地的 IP 地址创建服务器。
     * <p>
     * ===================================================================================================================
     * ServerSocket 的常用方法如下所示。
     * Server accept():监听并接收到此套接字的连接。
     * void bind(SocketAddress endpoint):将 ServerSocket 绑定到指定地址(IP 地址和端口号)。
     * void close():关闭此套接字。
     * InetAddress getInetAddress():返回此服务器套接字的本地地址。
     * int getLocalPort():返回此套接字监听的端口。
     * SocketAddress getLocalSoclcetAddress():返回此套接字绑定的端口的地址,如果尚未绑定则返回 null。
     * int getReceiveBufferSize():获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是从 ServerSocket 接收的套接字的建议缓冲区大小。
     *
     * @param args 服务端设计步骤:
     *             1.创建socket服务端
     *             serverSocket = new ServerSocket(1001);
     *             2.监听客户端
     *             server = serverSocket.accept();
     *             3.获取输入流
     *             server.getInputStream()
     *             4.获取输出流
     *             server.getOutputStream()
     *             5.关闭资源
     *             serverSocket.close();
     */
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket server = null;
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            //1.建立socket服务器
            serverSocket = new ServerSocket(1001);
            System.out.println("服务端创建成功----");
            while (true) {
                //2.监听客户端连接
                server = serverSocket.accept();
                //3.读取客户端数据
                reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
                String s = reader.readLine();
                System.out.println("服务端收到数据:" + s);
                //4.响应客户端
                writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
                writer.write("已经收到数据[" + s + "]\n");
                //清除
                writer.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭资源
                if (writer != null) {
                    writer.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (server != null) {
                    server.close();
                }
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
View Code

相关文章:

  • 2022-12-23
  • 2021-09-16
  • 2022-01-03
  • 2021-06-18
  • 2021-11-27
  • 2021-08-29
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-06
  • 2021-04-26
  • 2021-04-07
  • 2021-08-20
  • 2021-08-05
相关资源
相似解决方案