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

需求概述

服务器上有一个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值