在Java

时间:2015-11-20 22:31:46

标签: java sockets

只是想知道,我的任务是创建一个程序,在具有唯一数据库的多个服务器上实现两阶段提交协议。到目前为止,我已经完成了所需的一切工作 - 它适用于理论上n个服务器。但是,我希望程序在协议结束后保持打开状态,但每次都会关闭,大多数情况下会出现如下大错误:

java.nio.channels.ClosedByInterruptException java.nio.channels.ClosedByInterruptException at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:202) at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:163) at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65) at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109) at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389) at dcs.os.Server.queryDatabase(Server.java:162) at dcs.os.Server.lambda$processClient$1(Server.java:266) at dcs.os.Server$$Lambda$2/200825655.run(Unknown Source) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

我认为我需要放一个' while(true)'循环,但我已经尝试过它并没有起作用。任何想法如何编辑我的代码,以便可以多次查询服务器而无需重新运行程序?代码如下:

int serverListenPort = Integer.parseInt(args[1]); // The port that this server should listen on to accept connections from other servers
int clientListenPort = Integer.parseInt(args[2]); // The port that this server should listen on to accept connections from clients
InetSocketAddress[] otherServerAddresses = Server.parseAddresses(args[3]); // The addresses of the other servers

String databasePath = args[4]; // The path to the database file
MyServer server = new MyServer(databasePath);

if (args[1].endsWith("LastServer")) {
    server.setTail();
    args[1] = args[1].substring(0, args[1].indexOf('L'));
}

server.setServers(otherServerAddresses);

try{

    server.acceptClients(clientListenPort);
    int serverNo = (serverListenPort-8999) / 2;

    System.out.println(serverNo);

    if (serverNo == 1) {
        server.setHead();
    }

    server.acceptServers(serverListenPort);
    System.out.println("Closing server");
    server.close();
} catch {...} finally {...}

已请求的其他代码:

public void acceptServers(int port) throws IOException {

    if (acceptSS != null && acceptSS.isBound()) {
        acceptSS.close();
    }

    acceptSS = new ServerSocket(port);
    returnSock = acceptSS.accept();

    OutputStream os = returnSock.getOutputStream();
    InputStream is = returnSock.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(is));

    StockList request = request = new StockList();
    int itemCount = is.read();

    for (int i=0; i<itemCount; i++) {

        String item = in.readLine();
        int amount = Integer.decode(in.readLine()).intValue();
        request.add(item, amount);

    }

    StockList dbStock = queryDatabase();
    byte success = 0;
    if (dbStock.enough(request)) {
        success = 1;
    }

    os.write(success);

    if (is.read()==1) {
        System.out.println("COMMIT");
        dbStock.remove(request);
        writeDatabase(dbStock);
    }

    returnSock.close();
    acceptSS.close();

}

@Override
public void connectServers(InetSocketAddress[] servers) throws IOException {

    commSocks = new Socket[servers.length];
    System.out.println("Connecting...");
    for (int i=0; i<commSocks.length; i++) {
        commSocks[i] = new Socket();
        System.out.println(servers[i]);
        commSocks[i].connect(servers[i]);
        System.out.println("Connected.");
    }

}

0 个答案:

没有答案