当前位置: 代码迷 >> J2SE >> java呼叫远端主机class在远端运行之后传回字符串解决思路
  详细解决方案

java呼叫远端主机class在远端运行之后传回字符串解决思路

热度:145   发布时间:2016-04-24 01:51:21.0
java呼叫远端主机class在远端运行之后传回字符串
请教java呼叫远端主机class在远端运行之后传回字符串的开发方向(非web方式)

------解决方案--------------------
那就纯SOCKET + IO + 对象序列化。

------解决方案--------------------
rmi调用不知行不行
------解决方案--------------------
搞个TCP请求就OK了,不过也许直接启动个轻量级嵌入式Web服务器更方便。

如果是TCP的话:
1、服务器端监听某端口等待连接请求;
2、客户端连接该端口并发出请求信息(直接用String就好了),然后等待服务器端响应;
3、服务器接收该请求,进行处理后,回写客户端。

挺简单的。
------解决方案--------------------
探讨
如果是把一个excel档的内容读入成 Vector<String> 可以怎么传

------解决方案--------------------
回传信息更简单了吧。。。。。。楼主你是木写过此类代码么?

如果是用的NIO的话,服务器端直接SocketChannel.write()就可以了。

给你个服务器的样例,只会Echo,就是你发啥给它,它就回复啥:
Java code
package nio;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.text.DateFormat;import
------解决方案--------------------
一下子看不出来,你试试我这个Client,我本地是可以用的:

Java code
package nio;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;public class EchoTestClient {    private static int SOCKET_NUM = 55555;    private static DateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd HH:mm:ss");    /**     * @param args     */    public static void main(String[] args) {        new EchoTestClient().start();    }    private void start() {        SocketChannel client = null;        try {            Selector selector = Selector.open(); // 定义一个记录套接字通道事件的对象            client = connect(selector);            String a = "ABCD你好1234"; // 要发送的数据            while (true) {                ByteBuffer sendbuffer = ByteBuffer.allocate(40); // 定义用来存储发送数据的byte缓冲区                ByteBuffer readBuffer = ByteBuffer.allocate(40); // 定义用于接收服务器返回的数据的缓冲区                sendbuffer.put(a.getBytes()); // 将数据put进缓冲区                sendbuffer.flip(); // 将缓冲区各标志复位,因为向里面put了数据标志被改变要想从中读取数据发向服务器,就要复位                client.write(sendbuffer); // 向服务器发送数据                log("Send to server: " + new String(sendbuffer.array()));                // 利用循环来读取服务器发回的数据                {                    // 如果客户端连接没有打开就退出循环                    if (!client.isOpen())                        break;                    // 此方法为查询是否有事件发生如果没有就阻塞,有的话返回事件数量                    int shijian = selector.select(1000);                    // 如果没有事件返回循环                    if (shijian == 0) {                        continue;                    }                    // 定义一个临时的客户端socket对象                    SocketChannel sc;                    // 遍例所有的事件                    for (SelectionKey key : selector.selectedKeys()) {                        // 删除本次事件                        selector.selectedKeys().remove(key);                        // 如果本事件的类型为read时,表示服务器向本客户端发送了数据                        if (key.isReadable()) {                            // 将临时客户端对象实例为本事件的socket对象                            sc = (SocketChannel) key.channel();                            // 定义一个用于存储所有服务器发送过来的数据                            ByteArrayOutputStream bos = new ByteArrayOutputStream();                            // 将缓冲区清空以备下次读取                            readBuffer.clear();                            // 此循环从本事件的客户端对象读取服务器发送来的数据到缓冲区中                            while (sc.read(readBuffer) > 0) {                                // 将本次读取的数据存到byte流中                                bos.write(readBuffer.array());                                // 将缓冲区清空以备下次读取                                readBuffer.clear();                            }                            // 如果byte流中存有数据                            if (bos.size() > 0) {                                // 建立一个普通字节数组存取缓冲区的数据                                byte[] b = bos.toByteArray();                                log("Recive from server: " + new String(b));                            }                        }                    }                }                Thread.sleep(2000);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            // 关闭客户端连接,此时服务器在read读取客户端信息的时候会返回-1            if (client != null) {                try {                    client.close();                } catch (IOException e) {                }                log("Connection closed!");            }        }    }    private SocketChannel connect(Selector selector) throws IOException {        SocketAddress address = new InetSocketAddress("localhost", SOCKET_NUM); // 定义一个服务器地址的对象        SocketChannel client = SocketChannel.open(address); // 定义异步客户端        client.configureBlocking(false); // 将客户端设定为异步        client.register(selector, SelectionKey.OP_READ); // 在轮讯对象中注册此客户端的读取事件(就是当服务器向此客户端发送数据的时候)        return client;    }    private static void log(Object msg) {        System.out.println("CLIENT [" + dateFormatter.format(new Date()) + "]: " + msg);    }}
  相关解决方案