美文网首页
Socket学习

Socket学习

作者: hekirakuno | 来源:发表于2019-10-06 15:57 被阅读0次

socket是网络间进程通信的一种实现方式。

下图就是socket的原理图。


socket流程图

那么socket在哪里呢?又是服务于谁?
看下图:


socket抽象层的位置

我们使用java来做一次最简单的通信模拟吧。
服务端代码:

public class Server {
    public static void main(String[] args){
        try {
            System.out.println("【服务端:】服务端启动!");
            //监听端口为8080的连接(当不传参数时,默认绑定的服务器ip为127.0.0.1)
            ServerSocket server = new ServerSocket(8080);
            //建立socket通道(accept方法是阻塞方法)
            Socket socket = server.accept();
            System.out.println("【服务端:】监听到客户端连接!"+socket.getInetAddress());
            //读取数据流
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            //read方法是阻塞方法
            String info = bufferedReader.readLine();
            if(info!=null){
                System.out.println("【服务端:】读取客户端信息:"+info);
            }

            //回复消息
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.print("【服务端:】我是服务端!你好呀!");
            printWriter.flush();
            //关闭输出流
            socket.shutdownOutput();
            //按层关闭所有流
            printWriter.close();
            outputStream.close();
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            socket.close();
            server.close();
        } catch (IOException e) {
//            e.printStackTrace();
        }
    }
}

客户端代码

public class Client {
    public static void main(String[] args){
        try {
            //创建一个客户端,目标服务器ip为127.0.0.1,目标端口号为8080
            Socket socket = new Socket("127.0.0.1",8080);
            //发送信息流
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.print("【客户端:】我是客户端!你好呀!!!");
            //将缓冲区的数据强制输出,用于清空缓冲区,若直接调用close()方法,则可能会丢失缓冲区的数据。所以通俗来讲它起到的是刷新的作用。
            //而且如果不flush,服务端其实接收不到这边的信息的。尴尬哦!
            printWriter.flush();
            //关闭输出流
            socket.shutdownOutput();
            //接收信息流
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            String info = bufferedReader.readLine();
            if(info!=null){
                System.out.println("【客户端:】读取服务端消息:"+info);
            }
            //关闭所有流
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            printWriter.close();
            outputStream.close();
            socket.close();
        } catch (IOException e) {
//            e.printStackTrace();
        }
    }
}

先启动服务端,再启动客户端。我们可以看到两者的输出信息:


客户端
服务端你

参考资料:
socket原理

相关文章

  • 网络编程

    python学习笔记-网络编程 socket编程: socket()函数:socket.socket([famil...

  • #Socket回顾学习笔记

    Socket学习笔记 Socket基础知识 背景 Socket概念 Socket 又称"套接字",是系统提供的用于...

  • iOS#GCDAsyncSocket使用

    背景 最近在开发使用Socket,重新复习了socket基本知识,文章如下: #Socket回顾学习笔记UDP G...

  • HTTPS的理解

    1.Socket?后学习---------------------------------------------...

  • iOS_环信

    对于环信(即时聊天)分为三个方面学习: 1,Socket的网络通信,Socket相关难点理解(详见——Socket...

  • socket学习

    参考书籍《python核心编程第二版》 原文由于采用python2的版本,所以input函数采用的是raw_inp...

  • Socket学习

    一、 Socket介绍 来由:多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不...

  • Socket学习

    一、什么是Socket编程 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的...

  • Socket学习

    socket是网络间进程通信的一种实现方式。 下图就是socket的原理图。 那么socket在哪里呢?又是服务于...

  • socket学习

    一、什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket ...

网友评论

      本文标题:Socket学习

      本文链接:https://www.haomeiwen.com/subject/psvupctx.html