source: java/main/src/main/java/com/framsticks/core/LocalInstance.java @ 78

Last change on this file since 78 was 78, checked in by psniegowski, 11 years ago

Add f0 parsing and f0->Model transformation.

File size: 3.0 KB
Line 
1package com.framsticks.core;
2
3import com.framsticks.hosting.InstanceClient;
4import com.framsticks.params.AccessInterface;
5import com.framsticks.params.Param;
6import com.framsticks.util.*;
7import com.framsticks.util.Thread;
8import org.apache.log4j.Logger;
9
10import java.io.IOException;
11import java.net.InetSocketAddress;
12import java.net.ServerSocket;
13import java.net.Socket;
14import java.util.HashSet;
15import java.util.Set;
16
17
18/**
19 * @author Piotr Sniegowski
20 */
21public abstract class LocalInstance extends Instance {
22
23    private static final Logger LOGGER = Logger.getLogger(LocalInstance.class.getName());
24
25    public LocalInstance(Parameters parameters) {
26        super(parameters);
27
28        Integer accept = config.getInteger("accept", null);
29        if (accept != null) {
30            try {
31                acceptSocket = new ServerSocket();
32                acceptSocket.setReuseAddress(true);
33                acceptThread = new Thread(name + "-accept");
34                tryBind(accept);
35            } catch (IOException e) {
36                LOGGER.fatal("failed to create accept socket: " + e);
37            }
38        }
39    }
40
41    @Override
42    protected void run() {
43        super.run();
44    }
45
46    @Override
47    protected void configure() throws Exception {
48        super.configure();
49    }
50
51    protected final Set<InstanceClient> clients = new HashSet<InstanceClient>();
52    ServerSocket acceptSocket;
53    Thread acceptThread;
54
55    protected void acceptNext() {
56        acceptThread.invokeLater(new Runnable() {
57            @Override
58            public void run() {
59                try {
60                    final Socket socket = acceptSocket.accept();
61                    assert socket != null;
62                    LOGGER.debug("accepted socket: " + socket.getInetAddress().getHostAddress());
63                    invokeLater(new Runnable() {
64                        @Override
65                        public void run() {
66                            InstanceClient client = new InstanceClient(LocalInstance.this, socket);
67                            clients.add(client);
68                            LOGGER.info("client connected: " + client);
69                        }
70                    });
71                } catch (IOException e) {
72                    LOGGER.error("failed to accept socket: " + e);
73                }
74                acceptNext();
75            }
76        });
77    }
78
79    public void tryBind(final Integer accept) {
80        acceptThread.invokeLater(new Runnable() {
81            @Override
82            public void run() {
83                try {
84                    acceptSocket.bind(new InetSocketAddress(accept));
85                    LOGGER.debug("started accepting on port " + accept);
86                    acceptNext();
87                } catch (IOException e) {
88                    LOGGER.fatal("failed to accept on port " + accept + ": " + e);
89                }
90                try {
91                    java.lang.Thread.sleep(1000);
92                } catch (InterruptedException ignored) {
93                }
94                tryBind(accept);
95            }
96        });
97    }
98
99}
Note: See TracBrowser for help on using the repository browser.