使用Socket进行远程调用

来源:互联网 发布:rsync windows 编辑:程序博客网 时间:2024/06/05 02:46

现在服务端提供某个方法比如getPrice(int size),而服务端需要调用这个方法,使用socket进行通信来完成调用。需要客户端与服务端进行连接,服务端拿到客户端提供的参数,调用getPrice方法,将获得的结果返回给客户端。客户端这里只输出到控制台。
这里写图片描述
提供服务的程序

public class Shirt {    public String getPrice(int size){        return "T-Shirt价格为:"+size*3;    }}

服务端程序

/** * 服务端 * @author 12706 */public class ServiceServer {    public static void main(String[] args)  {        //创建ServerSocket绑定到本机的8081端口        ServerSocket server;        try {            server = new ServerSocket();            server.bind(new InetSocketAddress("localhost",8081));            while (true){                // 接受客户端的连接请求;accept是一个阻塞方法,会一直等待,到有客户端请求连接才返回                Socket socket = server.accept();                new Thread(new DataService(socket)).start();            }        } catch (Exception e) {            e.printStackTrace();        }    }}
public class DataService implements Runnable {    private Socket socket = null;    public DataService(Socket socket) {        this.socket = socket;    }    public void run() {        try {            //读取客户端发送的消息            //获取输入流            InputStream inputStream = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));            //从网络通信输入流中读取客户端发送过来的数据            //注意:socketinputstream的读数据的方法都是阻塞的            String size = br.readLine();            //调用函数获得结果返回给客户端            Shirt shirt = new Shirt();            String price = shirt.getPrice(new Integer(size));            //获取输出流            OutputStream outputStream = socket.getOutputStream();            PrintWriter pw = new PrintWriter(outputStream);            pw.println(price);            pw.flush();        } catch (IOException e) {            e.printStackTrace();        }finally {            if (socket!=null){                try {                    socket.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

客户端程序

public class ServiceClient {    static Socket socket = null;    public static void main(String[] args) {        try {            Scanner scanner = new Scanner(System.in);            System.out.println("输入size:");            int size = scanner.nextInt();            //建立连接            socket = new Socket("localhost", 8081);            //获取输出流,向服务端发送数据            OutputStream outputStream = socket.getOutputStream();            PrintWriter pw = new PrintWriter(outputStream);            pw.println(size);            pw.flush();            //获取输入流,读取服务端发送的消息            InputStream inputStream = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));            String line = br.readLine();            System.out.println(line);            scanner.close();        } catch (Exception e) {            e.printStackTrace();        }finally {            if (socket != null){                try {                    socket.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

测试:
启动服务端程序。
接着启动客户端程序,输入参数,获得服务端返回的结果
这里写图片描述
这里写图片描述