一、概述

Socket也是一种数据源

数据源<—-IO流—->应用

Socket是网络通信的端点

(通过IP地址和端口号绑定)
image.png

Unix中的Socket

Unix系统中 一切都是文件。

因为Scoket是网络通信的端点,可以进行数据的输入输入,所以Socket也可以看成文件

文件描述符是已打开文件的索引

所有被打开的文件都会赋予一个文件描述符,形成文件描述符表

每个进程都会维护一个文件描述符表

可能不同的文件描述符值指向同一个文件(流)

通过Socket发送数据

image.png
1、创建socket
2、告诉驱动程序指定IP地址和端口号绑定到Scoket
3、消息发送到Socket
4、驱动程序收到Socket的精确定位数据

通过Socket接收数据

image.png
1、创建Socket
2、绑定IP、端口号
3、信息传输给Socket
4、读取数据
ServerSocker:服务器端在网络通信上的端点
Socket:客户端在网络通信上的端点

二、建立ServerSocket连接

连接过程如下:

  1. 服务器端先调用bind绑定端口
  2. 然后进入accept阻塞状态等待客户端连接
  3. 客户端连接客户端,传入主机地址和端口号
  4. accept接收成功返回客户端的socket
  5. 通过IO流进行信息传输
  6. 通过close关闭服务器端口
  7. 关闭服务器端口

image.png

简单代码实例如下:

服务器端:

  1. package demo1.simple;
  2. import java.io.*;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class Client {
  6. public static void main(String[] args) {
  7. final int DEFAULT_PORT = 9999;
  8. Socket socket = null;
  9. ServerSocket serverSocket = null;
  10. BufferedWriter writer = null;
  11. BufferedReader reader = null;
  12. try {
  13. serverSocket = new ServerSocket(DEFAULT_PORT);
  14. System.out.println("服务器[" + DEFAULT_PORT + "]开启,正在等待客户端链接");
  15. while (true) {
  16. socket = serverSocket.accept();
  17. System.out.println("客户端[" + socket.getPort() + "]已连接到服务器");
  18. reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  19. String str =null;
  20. while ((str =reader.readLine())!=null) {
  21. if ("quit".equalsIgnoreCase(str)) {
  22. System.out.println("客户端" + socket.getPort() + "已断开连接");
  23. break;
  24. }
  25. System.out.println("客户端[" + socket.getPort() + "]:" + str);
  26. writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  27. writer.write("服务器回复信息:" + str + "\n");
  28. writer.flush();
  29. }
  30. }
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. } finally {
  34. try {
  35. if (socket != null) {
  36. socket.close();
  37. }
  38. if (serverSocket != null) {
  39. System.out.println("服务器已经关闭");
  40. serverSocket.close();
  41. }
  42. if (writer != null) {
  43. writer.close();
  44. }
  45. if (reader != null) {
  46. reader.close();
  47. }
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. }

客户端:

  1. package demo1.simple;
  2. import java.io.*;
  3. import java.net.Socket;
  4. import java.net.UnknownHostException;
  5. public class Service {
  6. public static void main(String[] args) {
  7. final int DEFAULT_PORT=9999;
  8. final String DEFAULT_HOST="localhost";
  9. boolean flag=true;
  10. Socket socket=null;
  11. BufferedReader reader=null;
  12. BufferedWriter writer=null;
  13. try {
  14. socket=new Socket(DEFAULT_HOST,DEFAULT_PORT);
  15. System.out.println("客户端已开启");
  16. reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  17. writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  18. String str=null;
  19. BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
  20. while (flag) {
  21. str = bufferedReader.readLine();
  22. if ("quit".equalsIgnoreCase(str)) {
  23. flag=false;
  24. writer.write(str);
  25. writer.flush();
  26. break;
  27. }
  28. writer.write(str + "\n");
  29. writer.flush();
  30. System.out.println(reader.readLine());
  31. }
  32. }catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. finally {
  36. try {
  37. if (socket != null) {
  38. System.out.println("Service已关闭");
  39. socket.close();
  40. }
  41. if (writer != null) {
  42. writer.close();
  43. }
  44. if (reader != null) {
  45. reader.close();
  46. }
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }

代码实验结果:
客户端:
image.png
服务器端:
image.png