001package edu.wpi.first.wpilibj.networktables2.server; 002 003import edu.wpi.first.wpilibj.networktables2.*; 004import edu.wpi.first.wpilibj.networktables2.stream.*; 005import edu.wpi.first.wpilibj.networktables2.thread.*; 006import edu.wpi.first.wpilibj.networktables2.type.*; 007 008/** 009 * A server node in NetworkTables 2.0 010 * 011 * @author Mitchell 012 * 013 */ 014public class NetworkTableServer extends NetworkTableNode implements ServerIncomingConnectionListener{ 015 private final ServerIncomingStreamMonitor incomingStreamMonitor; 016 private final WriteManager writeManager; 017 private final IOStreamProvider streamProvider; 018 private final ServerConnectionList connectionList; 019 020 /** 021 * Create a NetworkTable Server 022 * 023 * @param streamProvider 024 * @param threadManager 025 * @param transactionPool 026 */ 027 public NetworkTableServer(final IOStreamProvider streamProvider, final NetworkTableEntryTypeManager typeManager, final NTThreadManager threadManager){ 028 ServerNetworkTableEntryStore entryStore; 029 init(entryStore = new ServerNetworkTableEntryStore(this)); 030 this.streamProvider = streamProvider; 031 032 connectionList = new ServerConnectionList(); 033 writeManager = new WriteManager(connectionList, threadManager, getEntryStore(), Long.MAX_VALUE); 034 035 incomingStreamMonitor = new ServerIncomingStreamMonitor(streamProvider, entryStore, this, connectionList, typeManager, threadManager); 036 037 getEntryStore().setIncomingReceiver(new TransactionDirtier(writeManager)); 038 getEntryStore().setOutgoingReceiver(new TransactionDirtier(writeManager)); 039 040 incomingStreamMonitor.start(); 041 writeManager.start(); 042 } 043 /** 044 * Create a NetworkTable Server 045 * 046 * @param streamProvider 047 */ 048 public NetworkTableServer(final IOStreamProvider streamProvider){ 049 this(streamProvider, new NetworkTableEntryTypeManager(), new DefaultThreadManager()); 050 } 051 052 public void close(){ 053 try { 054 incomingStreamMonitor.stop(); 055 writeManager.stop(); 056 connectionList.closeAll(); 057 Thread.sleep(1000);//To get around bug where an error will occur in select if the socket server is closed before all sockets finish closing 058 streamProvider.close(); 059 Thread.sleep(1000); 060 } catch (Exception e) { 061 e.printStackTrace(); 062 } 063 } 064 065 public void onNewConnection(ServerConnectionAdapter connectionAdapter) { 066 connectionList.add(connectionAdapter); 067 } 068 069 070 public boolean isConnected() { 071 return true; 072 } 073 074 075 public boolean isServer() { 076 return true; 077 } 078 079}