private ChatView view; | private ChatView view; | ||||
private static Logger logger = OhmLogger.getLogger(); | private static Logger logger = OhmLogger.getLogger(); | ||||
public ConnectController(Transmitter m, ChatView v) | |||||
public ConnectController(Transmitter model, ChatView view) | |||||
{ | { | ||||
this.model = m; | |||||
this.view = v; | |||||
this.model = model; | |||||
this.view = view; | |||||
} | } | ||||
public void registerEvents() | public void registerEvents() | ||||
@Override | @Override | ||||
public void actionPerformed(ActionEvent ae) | public void actionPerformed(ActionEvent ae) | ||||
{ | { | ||||
Object o = ae.getSource(); | |||||
Object object = ae.getSource(); | |||||
if (o == view.getBtConnect()) { | |||||
if (object == view.getBtConnect()) | |||||
{ | |||||
int port = -1; | int port = -1; | ||||
try { | try { | ||||
view.getRbServer().setEnabled(false); | view.getRbServer().setEnabled(false); | ||||
view.getTfIP().setEnabled(false); | view.getTfIP().setEnabled(false); | ||||
view.getTfPort().setEnabled(false); | view.getTfPort().setEnabled(false); | ||||
} else { | |||||
view.getTfIP().setEnabled(view.getRbClient().isSelected()); | |||||
} | |||||
} | |||||
} | } | ||||
private boolean validIP (String ip) { | |||||
try { | |||||
if ( ip == null || ip.isEmpty() ) { | |||||
private boolean validIP (String ip) | |||||
{ | |||||
try | |||||
{ | |||||
if (ip == null || ip.isEmpty()) | |||||
{ | |||||
return false; | return false; | ||||
} | } | ||||
String[] parts = ip.split( "\\." ); | |||||
if ( parts.length != 4 ) { | |||||
String[] parts = ip.split("\\."); | |||||
if ( parts.length != 4 ) | |||||
{ | |||||
return false; | return false; | ||||
} | } | ||||
for ( String s : parts ) { | |||||
int i = Integer.parseInt( s ); | |||||
if ( (i < 0) || (i > 255) ) { | |||||
for (String s : parts) | |||||
{ | |||||
int i = Integer.parseInt(s); | |||||
if ((i < 0) || (i > 255)) | |||||
{ | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
if ( ip.endsWith(".") ) { | |||||
if (ip.endsWith(".")) | |||||
{ | |||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} catch (NumberFormatException e) { | |||||
} | |||||
catch (NumberFormatException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
} | } |
@Override | @Override | ||||
public void update(Observable observable, Object object) | public void update(Observable observable, Object object) | ||||
{ | { | ||||
String msg = (String)object; | |||||
String message = (String)object; | |||||
view.getTaCommunication().append(msg + "\n"); | |||||
view.getTaCommunication().append(message + "\n"); | |||||
} | } | ||||
} | } |
private Transmitter model; | private Transmitter model; | ||||
private ChatView view; | private ChatView view; | ||||
public SendController(Transmitter m, ChatView v) | |||||
public SendController(Transmitter model, ChatView view) | |||||
{ | { | ||||
this.model = m; | |||||
this.view = v; | |||||
this.model = model; | |||||
this.view = view; | |||||
} | } | ||||
public void registerEvents() | public void registerEvents() |
public void init() | public void init() | ||||
{ | { | ||||
if (thd == null) { | |||||
if (thd == null) | |||||
{ | |||||
thd = new Thread(this); | thd = new Thread(this); | ||||
thd.start(); | thd.start(); | ||||
} | } | ||||
public void sendMessage(String msg) | public void sendMessage(String msg) | ||||
{ | { | ||||
if (ready) { | |||||
if (ready) | |||||
{ | |||||
writer.println(msg); | writer.println(msg); | ||||
writer.flush(); | writer.flush(); | ||||
} else { | |||||
} | |||||
else | |||||
{ | |||||
logger.warning("Server not ready to send message. Connect first"); | logger.warning("Server not ready to send message. Connect first"); | ||||
} | } | ||||
} | } | ||||
while (true) | while (true) | ||||
{ | { | ||||
if (socket == null) { | |||||
try { | |||||
if (socket == null) | |||||
{ | |||||
try | |||||
{ | |||||
socket = new Socket(ip, port); | socket = new Socket(ip, port); | ||||
logger.info("Connected to server"); | logger.info("Connected to server"); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.getMessage()); | logger.severe(e.getMessage()); | ||||
socket = null; | socket = null; | ||||
try { | |||||
try | |||||
{ | |||||
Thread.sleep(1000); | Thread.sleep(1000); | ||||
} catch (InterruptedException ex) { | |||||
} | |||||
catch (InterruptedException ex) | |||||
{ | |||||
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); | Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); | ||||
} | } | ||||
continue; | continue; | ||||
} | } | ||||
InputStream iStream; | InputStream iStream; | ||||
try { | |||||
try | |||||
{ | |||||
iStream = socket.getInputStream(); | iStream = socket.getInputStream(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.getMessage()); | logger.severe(e.getMessage()); | ||||
return; | return; | ||||
} | } | ||||
OutputStream oStream; | OutputStream oStream; | ||||
try { | |||||
try | |||||
{ | |||||
oStream = socket.getOutputStream(); | oStream = socket.getOutputStream(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.getMessage()); | logger.severe(e.getMessage()); | ||||
return; | return; | ||||
} | } | ||||
InputStreamReader isr; | InputStreamReader isr; | ||||
try { | |||||
try | |||||
{ | |||||
isr = new InputStreamReader(iStream, "UTF-8"); | isr = new InputStreamReader(iStream, "UTF-8"); | ||||
} catch (UnsupportedEncodingException e) { | |||||
} | |||||
catch (UnsupportedEncodingException e) | |||||
{ | |||||
logger.severe(e.getMessage()); | logger.severe(e.getMessage()); | ||||
return; | return; | ||||
} | } | ||||
OutputStreamWriter osr; | OutputStreamWriter osr; | ||||
try { | |||||
try | |||||
{ | |||||
osr = new OutputStreamWriter(oStream, "UTF-8"); | osr = new OutputStreamWriter(oStream, "UTF-8"); | ||||
} catch (UnsupportedEncodingException e) { | |||||
} | |||||
catch (UnsupportedEncodingException e) | |||||
{ | |||||
logger.severe(e.getMessage()); | logger.severe(e.getMessage()); | ||||
return; | return; | ||||
} | } | ||||
reader = new BufferedReader(isr); | reader = new BufferedReader(isr); | ||||
writer = new PrintWriter(osr); | |||||
writer = new PrintWriter(osr); | |||||
ready = true; | ready = true; | ||||
} | } | ||||
if (ready) { | |||||
if (ready) | |||||
{ | |||||
String msg; | String msg; | ||||
try { | |||||
logger.info("Waiting for message"); | |||||
try | |||||
{ | |||||
logger.info("Waiting"); | |||||
msg = reader.readLine(); | msg = reader.readLine(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } |
private BufferedReader reader; | private BufferedReader reader; | ||||
private PrintWriter writer; | private PrintWriter writer; | ||||
private volatile boolean ready; | private volatile boolean ready; | ||||
private Thread thd; | |||||
private static final SimpleDateFormat sdf = new SimpleDateFormat("HH.mm.ss"); | |||||
private Thread thd; | |||||
public Server(int port) | public Server(int port) | ||||
{ | { | ||||
@Override | @Override | ||||
public void run() | public void run() | ||||
{ | { | ||||
logger.info("Running server..."); | |||||
logger.info("Server running"); | |||||
while (true) | while (true) | ||||
{ | { | ||||
if (server == null) { | |||||
try { | |||||
if (server == null) | |||||
{ | |||||
try | |||||
{ | |||||
server = new ServerSocket(port); | server = new ServerSocket(port); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
logger.info("Waiting for client to connect"); | |||||
try { | |||||
logger.info("Waiting for client"); | |||||
try | |||||
{ | |||||
client = server.accept(); | client = server.accept(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
logger.info("Client connected"); | logger.info("Client connected"); | ||||
InputStream iStream; | InputStream iStream; | ||||
try { | |||||
try | |||||
{ | |||||
iStream = client.getInputStream(); | iStream = client.getInputStream(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
OutputStream oStream; | OutputStream oStream; | ||||
try { | |||||
try | |||||
{ | |||||
oStream = client.getOutputStream(); | oStream = client.getOutputStream(); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
InputStreamReader isr; | InputStreamReader isr; | ||||
try { | |||||
try | |||||
{ | |||||
isr = new InputStreamReader(iStream, "UTF-8"); | isr = new InputStreamReader(iStream, "UTF-8"); | ||||
} catch (UnsupportedEncodingException e) { | |||||
} | |||||
catch (UnsupportedEncodingException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
OutputStreamWriter osr; | OutputStreamWriter osr; | ||||
try { | |||||
try | |||||
{ | |||||
osr = new OutputStreamWriter(oStream, "UTF-8"); | osr = new OutputStreamWriter(oStream, "UTF-8"); | ||||
} catch (UnsupportedEncodingException e) { | |||||
} | |||||
catch (UnsupportedEncodingException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
return; | return; | ||||
} | } | ||||
reader = new BufferedReader(isr); | reader = new BufferedReader(isr); | ||||
writer = new PrintWriter(osr); | |||||
ready = true; | |||||
writer = new PrintWriter(osr); | |||||
ready = true; | |||||
} | } | ||||
if (ready) { | |||||
try { | |||||
if (ready) | |||||
{ | |||||
try | |||||
{ | |||||
logger.info("Waiting for message"); | logger.info("Waiting for message"); | ||||
String msg = reader.readLine(); | String msg = reader.readLine(); | ||||
if (msg == null) { | |||||
if (msg == null) | |||||
{ | |||||
ready = false; | ready = false; | ||||
continue; | continue; | ||||
} | } | ||||
this.setChanged(); | this.setChanged(); | ||||
this.notifyObservers(msg); | this.notifyObservers(msg); | ||||
} catch (IOException e) { | |||||
} | |||||
catch (IOException e) | |||||
{ | |||||
logger.severe(e.toString()); | logger.severe(e.toString()); | ||||
ready = false; | ready = false; | ||||
continue; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
public void sendMessage(String msg) | public void sendMessage(String msg) | ||||
{ | { | ||||
if (ready) { | |||||
if (ready) | |||||
{ | |||||
writer.println(msg); | writer.println(msg); | ||||
writer.flush(); | writer.flush(); | ||||
} else { | |||||
logger.warning("Server not ready to send message. Connect first"); | |||||
} else | |||||
{ | |||||
logger.warning("Server not ready"); | |||||
} | } | ||||
} | } | ||||
public void connectToPeer(boolean mode, String ip, int port) | public void connectToPeer(boolean mode, String ip, int port) | ||||
{ | { | ||||
if (initialized) { | |||||
logger.info("Chat already running"); | |||||
if (initialized) | |||||
{ | |||||
logger.info("Chat's already running"); | |||||
return; | return; | ||||
} | } | ||||
this.mode = mode; | this.mode = mode; | ||||
if (mode) { | |||||
if (mode) | |||||
{ | |||||
logger.info("Running as server"); | logger.info("Running as server"); | ||||
srv = new Server(port); | srv = new Server(port); | ||||
srv.addObserver(this); | srv.addObserver(this); | ||||
srv.init(); | srv.init(); | ||||
} else { | |||||
} | |||||
else | |||||
{ | |||||
logger.info("Running as client"); | logger.info("Running as client"); | ||||
cli = new Client(ip, port); | cli = new Client(ip, port); | ||||
cli.addObserver(this); | cli.addObserver(this); | ||||
cli.init(); | cli.init(); | ||||
} | |||||
} | |||||
initialized = true; | initialized = true; | ||||
} | } | ||||
public void sendMessage(String msg) | public void sendMessage(String msg) | ||||
{ | { | ||||
if (!initialized) { | |||||
if (!initialized) | |||||
{ | |||||
logger.warning("Chat not initialized"); | logger.warning("Chat not initialized"); | ||||
return; | return; | ||||
} | } | ||||
if (mode) { | |||||
if (mode) | |||||
{ | |||||
srv.sendMessage(msg); | srv.sendMessage(msg); | ||||
} else { | |||||
} | |||||
else | |||||
{ | |||||
cli.sendMessage(msg); | cli.sendMessage(msg); | ||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
public void update(Observable o, Object o1) | |||||
public void update(Observable observable, Object object) | |||||
{ | { | ||||
this.setChanged(); | this.setChanged(); | ||||
this.notifyObservers(o1); | |||||
this.notifyObservers(object); | |||||
} | } | ||||
} | } |
<Component id="lbIP" min="-2" max="-2" attributes="0"/> | <Component id="lbIP" min="-2" max="-2" attributes="0"/> | ||||
<EmptySpace max="-2" attributes="0"/> | <EmptySpace max="-2" attributes="0"/> | ||||
<Component id="tfIP" min="-2" pref="191" max="-2" attributes="0"/> | <Component id="tfIP" min="-2" pref="191" max="-2" attributes="0"/> | ||||
<EmptySpace pref="34" max="32767" attributes="0"/> | |||||
<EmptySpace pref="247" max="32767" attributes="0"/> | |||||
<Component id="btConnect" min="-2" max="-2" attributes="0"/> | <Component id="btConnect" min="-2" max="-2" attributes="0"/> | ||||
</Group> | </Group> | ||||
<Group type="102" alignment="0" attributes="0"> | <Group type="102" alignment="0" attributes="0"> | ||||
<Group type="103" groupAlignment="0" attributes="0"> | <Group type="103" groupAlignment="0" attributes="0"> | ||||
<Group type="102" alignment="0" attributes="0"> | <Group type="102" alignment="0" attributes="0"> | ||||
<EmptySpace max="-2" attributes="0"/> | <EmptySpace max="-2" attributes="0"/> | ||||
<Component id="jScrollPane1" pref="134" max="32767" attributes="0"/> | |||||
<Component id="jScrollPane1" pref="243" max="32767" attributes="0"/> | |||||
<EmptySpace type="separate" max="-2" attributes="0"/> | <EmptySpace type="separate" max="-2" attributes="0"/> | ||||
<Group type="103" groupAlignment="3" attributes="0"> | <Group type="103" groupAlignment="3" attributes="0"> | ||||
<Component id="tfMessage" alignment="3" min="-2" pref="25" max="-2" attributes="0"/> | <Component id="tfMessage" alignment="3" min="-2" pref="25" max="-2" attributes="0"/> | ||||
</Component> | </Component> | ||||
<Component class="javax.swing.JTextField" name="tfPort"> | <Component class="javax.swing.JTextField" name="tfPort"> | ||||
<Properties> | <Properties> | ||||
<Property name="text" type="java.lang.String" value="3210"/> | |||||
<Property name="text" type="java.lang.String" value="45000"/> | |||||
<Property name="toolTipText" type="java.lang.String" value=""/> | <Property name="toolTipText" type="java.lang.String" value=""/> | ||||
</Properties> | </Properties> | ||||
</Component> | </Component> |
btSend.setText("send"); | btSend.setText("send"); | ||||
tfPort.setText("3210"); | |||||
tfPort.setText("45000"); | |||||
tfPort.setToolTipText(""); | tfPort.setToolTipText(""); | ||||
lbPort.setText("Port:"); | lbPort.setText("Port:"); | ||||
.addComponent(lbIP) | .addComponent(lbIP) | ||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) | ||||
.addComponent(tfIP, javax.swing.GroupLayout.PREFERRED_SIZE, 191, javax.swing.GroupLayout.PREFERRED_SIZE) | .addComponent(tfIP, javax.swing.GroupLayout.PREFERRED_SIZE, 191, javax.swing.GroupLayout.PREFERRED_SIZE) | ||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) | |||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 247, Short.MAX_VALUE) | |||||
.addComponent(btConnect)) | .addComponent(btConnect)) | ||||
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() | .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() | ||||
.addComponent(rbClient, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE) | .addComponent(rbClient, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE) | ||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) | ||||
.addGroup(layout.createSequentialGroup() | .addGroup(layout.createSequentialGroup() | ||||
.addContainerGap() | .addContainerGap() | ||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE) | |||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 243, Short.MAX_VALUE) | |||||
.addGap(18, 18, 18) | .addGap(18, 18, 18) | ||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) | ||||
.addComponent(tfMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) | .addComponent(tfMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) |