• 实现socket的服务和客户端通信


    对学习过程中自己敲的一些关于socket有关的代码做了个简单总结,在这分享一下,给有需要的同学借鉴一下。

    什么是socket?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
    建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
    Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
    Java就给我们提供了socket,我们只要会使用就可以了,接下来为大家介绍一个简单的socket小例子,完成socket服务和客户端间的通信。
    这是我们socket小例子的一个简单架构,由服务端、客户端、线程工作业务逻辑、数据获取类组成。

    首先我们先来完成socket服务端的代码开发。

    在服务端的main方法里,我们将socketserver对象设置成持久的,并绑定于本机的8899端口上,去接收客户端的socket连接。

    package com.wenbing.socket;
    
    import java.net.InetSocketAddress;
    import java.net.Proxy;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServiceServer {
    
        public static void main(String[] args) throws Exception{
    //        创建一个serversocket,绑定到本机的8899端口上
            ServerSocket server = new ServerSocket();
            server.bind(new InetSocketAddress("localhost", 8899));
    
    //        接收客户端的连接;accept是一个阻塞方法,会一直等待,到有客户端请求连接才返回
            while (true) {
                Socket socket = server.accept();
    //            每个socket请求都给一个线程来处理
                new Thread(new ServiceServerTask(socket)).start();
    
            }
    
        }
    
    }
     我们定义一个服务端处理客户端请求过来的数据处理线程工作类,让每个请求来的socket都由每一个线程去执行业务逻辑,ServiceServerTask类实行Runnable接口。
    package com.wenbing.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    public class ServiceServerTask implements Runnable {
    
        Socket socket;
        InputStream inputStream = null;
        OutputStream outputStream = null;
    
        public ServiceServerTask(Socket socket) {
            this.socket = socket;
        }
    
        //    业务逻辑,跟客户端进行数据交互
        @Override
        public void run() {
    
            try {
    //            从socket连接中获取到与client之间的网络通信输入流
                inputStream = socket.getInputStream();
    //            从socket连接中获取到与client之间的网络通信输出流
                outputStream = socket.getOutputStream();
    
    //            BufferedReader读取数据是一个字符一个字符读取,遇到回车即停止
                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    //            从网络通信输入流中读取客户端发送过来的数据,读取一行,遇到回车即结束
                // 注意:socketinputstream的读数据的方法是阻塞的
                //读取很多行数据,用while循环读
    //            String line = "";
    //            String param = "";
    //            while (( line = br.readLine()) != null) {
    //                param = br.readLine();
    //                System.out.println(param);
    //            }
                String param = br.readLine();
    
                System.out.println(param);
                GetDataServiceImpl getDataService = new GetDataServiceImpl();
                String result = getDataService.getData(param);
    
    //            将调用结果写到socket的输出流中,以发送给客户端
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(result);
                printWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
    //                关流,现在是在每个线程里
                    inputStream.close();
                    outputStream.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
    
        }
    }

    处理数据的方法。

    package com.wenbing.socket;
    
    public class GetDataServiceImpl {
    
        public String getData(String param) {
            return "OK-" + param;
        }
    
    }

    接下来就是socket客户端了。客户端和服务端代码基本相同。

    package com.wenbing.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    public class ServiceClient {
    
        public static void main(String[] args) throws Exception {
    //        向服务器发出请求建立连接
            Socket socket = new Socket("localhost", 8899);
    //        从socket中获取输出流
            InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream();
    
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println("hello");
            printWriter.flush();
    
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String result = bufferedReader.readLine();
            System.out.println(result);
    
            inputStream.close();
            outputStream.close();
            socket.close();
        }
    
    }

    简单的socket小例子,送给java小白们。

    纸上得来终觉浅,绝知此事要躬行,一定要跟着敲一敲才更容易理解哦。

  • 相关阅读:
    使用matplotlib绘制常用图表(3)其他图表绘制
    python简单爬虫
    使用matplotlib绘制常用图表(2)常用图标设置
    一个GISer的使命
    SQL2008″Unable to read the list of previously registered servers on this system”
    Eclipse语言包安装
    eclipse查看JDK源码
    Eclipse中设置javadoc中文帮助文档
    GDI+处理图像时出现内存不足的问题
    利用github搭建私人maven仓库
  • 原文地址:https://www.cnblogs.com/wenbinshen/p/9893380.html
Copyright © 2020-2023  润新知