码迷,mamicode.com
首页 > 其他好文 > 详细

测试Socket中的一个中断的方法

时间:2015-03-09 16:20:20      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

/*
 * 本程序用于测试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);
}
}
}
}

测试Socket中的一个中断的方法

标签:

原文地址:http://blog.csdn.net/u012965373/article/details/44154907

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!