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

/*

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

}

}

}

}

时间: 2024-10-12 20:25:22

测试Socket中的一个中断的方法的相关文章

ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_recv - 从一个socket中接受一个消息帧 Synopsis int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags); Description zmq_msg_recv()函数和zmq_recvmsg(3)函数是完全相同的,

html中隐藏一个元素的方法

display:none;                                                      隐藏不占位 opacity:0; fliter:alpha(opacity=0);  隐藏占位 visibility:hidden;   隐藏占位 position:absolute; left:-99999px;

Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言.同样的,din是输入流的代言. 可以造成dout被关闭的操作有: 1.调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出

zmq_recvmsg – 从一个socket上接收一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3)         ØMQ Manual - ØMQ/4.1.0 Name zmq_recvmsg – 从一个socket上接收一个消息帧 Synopsis int zmq_recvmsg (void *socket, zmq_msg_t *msg, int flags); Description 函数zmq_recvmsg()会从socket参数指定的socket中接

需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次,超过5次提示:游戏试玩结束,请付费。

package cn.idcast4; import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.Reader;import java.io.Writer;import java.util.Properties; /* * 需求:有一个猜数字小游戏,请写一个程序实现在测试类中只能使用5次, *

RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接

如果你的服务器有如下错误: “RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接.” 可能的有2种: 1:你试试能否能继续远程登陆,有可能你的远程登陆组件出现问题. 2:有人攻击你,使用暴力破解的方法登陆你的系统,导致系统拒绝服务. 一句话注意防贼!! 解决方法: 设置组策略=====>管理摸板=====>wndows组件====>终端服务!! 新的补充(比较狠的解决方法,呵呵.): 事件类型: 错误 事件来源: TermDD 描述: RDP 的 "DAT

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的. 比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有.如果调用了有注解的addPerson()方法,会启动一个Transaction:如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的. @Service public cla

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个测试实例来测试升级等.在这种情况下,你的 Confluence 可以回运行 2 个不同的版本,而且也是非常常见的.这个文档将会知道你如何拷贝生产环境中的数据到一个测试实例中,同时测试环境的版本和生产环境中的版本还有可能是不同的. 在开始这个操作指南之前,

bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind

今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一点特别的是另外一个js的方法中会进行一个ajax, 会根据ajax返回的结果来进行返回true或者false. 在测试的过程中我发现不管怎么弄, 最后返回的都是undefind. 下面来模拟一下这个场景 上面这个例子中,flag一直都是undefind,ajax已经是同步的情况下依旧返回undefi