Socket太抽象之我的理解


一、百度一下?

不得不承认,这个词太抽象!
翻译过来叫 套接字,英文的意思是 插座的孔!
百度一下:貌似是干网络通讯用的。
在这里插入图片描述
于是,我想用最通俗的话,讲一讲我的理解,如有不妥之处,请指教:

二、我的理解:

操作系统 ——不管是Windows,还是Linux,
都自带一个 Socket库
“库”,就是已经编好的程序集,学习C的时候要#include导库,java也要import导包。
Socket库 就是 调用网络功能的程序组件集合,这里是由Windows系统提供的哦~

(Socket最开始是 加州大学伯克利分校的 UNIX系统 BSD上的一个 C语言库
后来 其他操作系统 以及 C语言之外的其他语言 也参照这个Socket库开发了 相应的网络库!)



PS:举个最常见的应用例子:根据域名查询IP地址时,浏览器会使用 Socket库 中的 解析器
Socket库里 有一个叫 解析器 的程序,
我们的浏览器打算向服务器发送请求消息,
但是请求消息里只有服务器的URL,没有服务器的IP地址,
于是 浏览器 要通过 解析器 向 DNS服务器 去查,
传参这个网址,解析器返回相应的IP地址,
就像如下这样,把查询到的IP地址写入浏览器指定的内存中,
接下来浏览器再进行请求和接受服务器的响应:

<内存地址>=getHostByName("www.baidu.com");

好了,现在,你就把Socket想象成一个 中间介质
实际上就是 一块用于存放控制信息的内存空间
程序可以通过套接字,让操作系统控制 底层硬件。

说的通俗一点:
程序里,当你往套接字里写东西的时候,
操作系统就不断读这个套接字文件(当然也是按排队的顺序读的),
去控制硬件,进行通信,
之后你再写,操作系统再读。

*PS:比如你可以写一个Socket程序,
这个socket是接收tcp/ip协议的数据的,
那么,操作系统就会从这个程序中得知,
要不断接收TCP/IP数据,把硬件的信息拿给你看。

三、动手用Java写一个简单的Socket程序:

(1)服务器:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            //开启服务
            ServerSocket s = new ServerSocket(9000);
            System.out.println("服务已经开启等待客户端访问");

            // 等待客户来访问(如果没有客户访问,该方法阻塞)
            Socket socket = s.accept();
            System.out.println("接收到" + socket.getInetAddress().getHostAddress() + "客户端的访问");

            //服务端读
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str = br.readLine();
            System.out.println(str);

            //服务器写
            BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
            String str1 = br1.readLine();
            PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
            out.println(str1);
            socket.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}



(2)客户端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 9000);
            System.out.println("客户端连接服务器");

            // 客户端写
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println(str);

            //客户端读
            BufferedReader br1 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str1 = br1.readLine();
            System.out.println(str1);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

说明:
此程序先打开(运行Main())服务器,再打开(运行Main())客户端,
客户端先发言,服务器收到,接下来,服务器发言,客户端收到,程序结束。
可以改进:
把发言对话的代码放进while()循环,就可以一直对话,
把双方发言和接受写到两个线程中,就可以连着说话。

PS:上面客户端的InputStream对应服务器的OutputStream,
服务器的InputStream对应客户端的OutputStream,
如果你对InputStream或者OutputStream有疑问,
请参考我的这篇文章,我用浅显易懂的语言说明了它们的区别:

链接: InputStream和OutputStream的参考点是谁?

四、网络编程:

跨平台编程,就要用到套接字:
跨平台:windows/Linux/IOS/Android
参考网站:https://edu.51cto.com/course/8486.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值