/*
* 本程序用于测试Socket中的一个中断的方法
* 对于进行的线程可以对其进行停止的中断
* 是通过SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port));
* */
package interruptible;
import java.awt.BorderLayout;
import java.awt.EventQueue;
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.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class InterruptibleSocketTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
JFrame frame = new InterruptibleSocketFrame();
frame.setTitle("Socket半关闭的实验!!");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
}
class InterruptibleSocketFrame extends JFrame{
private static final int TEXT_ROWS = 20;
private static final int TEXT_COLUMNS = 60;
private Scanner in;
//按钮
private JButton interruptibleButton;
private JButton blockingButton;
private JButton canelButton;
private JTextArea messages;
private TestServer server;
private Thread connectThread;
public InterruptibleSocketFrame(){
JPanel northPanel = new JPanel();
add(northPanel, BorderLayout.NORTH);
messages = new JTextArea(TEXT_ROWS, TEXT_COLUMNS);
add(new JScrollPane(messages));
interruptibleButton = new JButton("Interruptible");
blockingButton = new JButton("Blocking");
northPanel.add(interruptibleButton);
northPanel.add(blockingButton);
interruptibleButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
interruptibleButton.setEnabled(false);
blockingButton.setEnabled(false);
canelButton.setEnabled(true);
connectThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try{
connectInterruptibly();
}catch(IOException e){
messages.append("\nInterruptibleSocketTest.connectInterruptibly: " + e);
}
}
});
connectThread.start();
}
});
blockingButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
interruptibleButton.setEnabled(false);
blockingButton.setEnabled(false);
canelButton.setEnabled(true);
connectThread = new Thread(new Runnable(){
public void run(){
try{
connectBlocking();
}catch(IOException e){
messages.append("\nInterruptibleSocketTest.connectBlocking : " + e);
}
}
});
connectThread.start();
}
});
canelButton = new JButton("Cannel");
canelButton.setEnabled(false);
northPanel.add(canelButton);
canelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
connectThread.interrupt();
canelButton.setEnabled(false);
}
});
server = new TestServer();
new Thread(server).start();
pack();
}
public void connectInterruptibly() throws IOException{
messages.append("Interruptible:\n");
try(SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 8189))){
in = new Scanner(channel);
while(!Thread.currentThread().isInterrupted()){
messages.append("Reading ");
if(in.hasNextLine())
{
String line = in.nextLine();
messages.append(line);
messages.append("\n");
}
}
}finally{
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
messages.append("Channel closed\n");
interruptibleButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
public void connectBlocking() throws IOException{
messages.append("Blocking:\n");
try(Socket sock = new Socket("localhost", 8189)){
in = new Scanner(sock.getInputStream());
while(!Thread.currentThread().isInterrupted()){
messages.append("Reading ");
if(in.hasNextLine()){
String line = in.nextLine();
messages.append(line);
messages.append("\n");
}
}
}finally{
EventQueue.invokeLater(new Runnable(){
public void run(){
messages.append("Socket closed\n");
interruptibleButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
class TestServer implements Runnable{
public void run(){
try{
ServerSocket s = new ServerSocket(8189);
while(true){
Socket incoming = s.accept();
Runnable r = new TestServerHandler(incoming);
Thread t = new Thread(r);
t.start();
}
}catch(IOException e){
messages.append("\nTestServer.run: " + e);
}
}
}
class TestServerHandler implements Runnable{
private Socket incoming;
private int counter;
public TestServerHandler(Socket i){
incoming = i;
}
public void run(){
try{
try{
OutputStream outStream = incoming.getOutputStream();
PrintWriter out = new PrintWriter(outStream, true);
while(counter <= 100){
counter++;
if(counter <= 10){
out.println(counter);
}
Thread.sleep(100);
}
}finally{
incoming.close();
messages.append("Closing server\n");
}
}catch(Exception e){
messages.append("\nTestServerHandler.run: " + e);
}
}
}
}