一、百度一下?
不得不承认,这个词太抽象!
翻译过来叫 套接字,英文的意思是 插座的孔!
百度一下:貌似是干网络通讯用的。
于是,我想用最通俗的话,讲一讲我的理解,如有不妥之处,请指教:
二、我的理解:
操作系统 ——不管是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