java socket外网连接_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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值