package InterruptibleSocketTest;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.SocketChannel;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class InterruptibleSocketFrame extends JFrame
{
public InterruptibleSocketFrame()
{
setSize(WIDTH, HEIGHT);
setTitle("InterruptibleSocketTest");
JPanel northPanel = new JPanel();
add(northPanel, BorderLayout.NORTH);
messages = new JTextArea();
add(new JScrollPane(messages));
busyBox = new JCheckBox("Busy");
northPanel.add(busyBox);
startButton = new JButton("Start");
northPanel.add(startButton);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
startButton.setEnabled(false);
cancelButton.setEnabled(true);
connectThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
connect();
}
});
connectThread.start();
}
});
cancelButton = new JButton("Cancel");
cancelButton.setEnabled(false);
northPanel.add(cancelButton);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
connectThread.interrupt();
startButton.setEnabled(true);
cancelButton.setEnabled(false);
}
});
server = new TestServer();
new Thread(server).start();
}
/**
* Conectarea la Server
*/
public void connect()
{
try
{
SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 8189));
try
{
in = new Scanner(channel);
while(true)
{
if(in.hasNextLine())
{
String line = in.nextLine();
messages.append(line);
messages.append("\n");
}
else Thread.sleep(100);
}
}
finally
{
channel.close();
messages.append("Socket Closed\n");
}
}
catch(IOException e)
{
messages.append("\nInterruptibleSocketTest.connect : " + e);
}
catch(InterruptedException e)
{
messages.append("\nInterruptibleSocketTest.connect : " + e);
}
}
/**
* Server multiStream, care asteapa connectarea pe portul 8189 si transmite clientului urmatoarele valori
* @author Dan
*
*/
class TestServer implements Runnable
{
@Override
public void run() {
// TODO Auto-generated method stub
try
{
int i = 1;
ServerSocket s = new ServerSocket(8189);
while(true)
{
Socket incoming = s.accept();
Runnable r = new RandomNumberHandler(incoming);
Thread t = new Thread(r);
t.start();
}
}
catch(IOException e)
{
messages.append("\nTestServer.run " + e);
}
}
}
/**
* Acest Clas prelucreaza datele , primite de la client inntri conectiune
* @author Dan
*
*/
class RandomNumberHandler implements Runnable
{
/**
* Constructor de prelucrare
* @param i Socket
*/
public RandomNumberHandler(Socket i)
{
incoming = i;
}
@Override
public void run() {
// TODO Auto-generated method stub
try
{
OutputStream outStream = incoming.getOutputStream();
PrintWriter out = new PrintWriter(outStream, true);/*Transmiterea automata a datelor ramase*/
Random generator = new Random();
while(true)
{
if(!busyBox.isSelected())
{
out.println(generator.nextInt());
}
Thread.sleep(100);
}
}
catch (IOException e)
{
messages.append("\nRandomNumberHandler.run " + e);
}
catch (InterruptedException e)
{
messages.append("\nRandomNumberHandler.run " + e);
}
}
private Socket incoming;
}
public static Scanner in;
private JButton startButton;
private JButton cancelButton;
private JTextArea messages;
private JCheckBox busyBox;
private Thread connectThread;
private TestServer server;
public static final int WIDTH = 400;
public static final int HEIGHT = 300;
}