需求概述
服务器上有一个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();
}
}