Java利用Socket进行远程过程调用

来源:互联网 发布:央视评论网络直播乱象 编辑:程序博客网 时间:2024/06/05 08:19

需求概述

服务器上有一个getData()方法,客户端想调用服务器的getData()方法,此时必须通过RPC来进行调用了。WebService太冗余,为了提高性能,决定直接用socket进行实现。

实现代码(Socket通讯模板代码)

BusinessServer.java

package com.mrbcy.bigdata.basic.socket;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;public class BusinessServer {    public static void main(String[] args) throws Exception {        // 创建一个ServerSocket,绑定到8899上        ServerSocket serverSocket = new ServerSocket();        serverSocket.bind(new InetSocketAddress(8899));        // 接受客户端的连接请求;accept是一个阻塞方法,会等待到客户端请求连接为止。        while(true){            Socket clientSocket = serverSocket.accept();            InetAddress inetAddress = clientSocket.getInetAddress();            System.out.println("客户端连接:" + inetAddress.getHostName() + ":" + clientSocket.getPort());            // 启动一个线程来处理业务            new Thread(new BusinessHandler(clientSocket)).start();        }    }}

BusinessHandler.java

package com.mrbcy.bigdata.basic.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;public class BusinessHandler implements Runnable{    private Socket clientSocket;    private InputStream is = null;    private OutputStream os = null;    public BusinessHandler(Socket clientSocket) {        this.clientSocket = clientSocket;    }    // 业务逻辑,跟客户端进行数据交互    @Override    public void run() {        try {            is = clientSocket.getInputStream();            os = clientSocket.getOutputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            // 获得客户端传入的参数,客户端一定要带一个回车符            String param = br.readLine();            // 获取数据            GetDataServiceImpl service = new GetDataServiceImpl();            String result = service.getData(param);            // 将调用结果输出到客户端socket中            PrintWriter pw = new PrintWriter(os);            pw.println(result);            pw.flush();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                is.close();                os.close();                clientSocket.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

GetDataServiceImpl.java

package com.mrbcy.bigdata.basic.socket;public class GetDataServiceImpl {    public String getData(String param){        return "ok-" + param;    }}

BusinessClient.java

package com.mrbcy.bigdata.basic.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class BusinessClient {    public static void main(String[] args) throws Exception {        // 向服务器发出请求建立连接        Socket socket = new Socket("localhost",8899);        // 从socket中获取输入输出流        InputStream in = socket.getInputStream();        OutputStream out = socket.getOutputStream();        PrintWriter pw = new PrintWriter(out);        pw.println("hello");        pw.flush();        BufferedReader br = new BufferedReader(new InputStreamReader(in));        String result = br.readLine();        System.out.println(result);        socket.close();    }}
0 0