网络---中断套接字Socket
package socketpack_2;
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;
/**
* 网络 -可中断套接字
* @author Visec·Dana
*/
public class InterruptibleSocketTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Thread()
{
public void run(){
JFrame frame=new InterruptibleSocketFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); }
}
);
}
}
class InterruptibleSocketFrame extends JFrame{
private static final long serialVersionUID = 1L;
public InterruptibleSocketFrame(){
setSize(WIDTH,HEIGHT);
setTitle("InterruptibleSocketTest"); JPanel northpJPanel =new JPanel();
add(northpJPanel,BorderLayout.NORTH); messages=new JTextArea();
add(new JScrollPane(messages));
interruptilButton=new JButton("Interruptilbel");
blockingButton=new JButton("Blocking"); northpJPanel.add(interruptilButton);
northpJPanel.add(blockingButton);
interruptilButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event){
interruptilButton.setEnabled(false);
blockingButton.setEnabled(false);
canncelButton.setEnabled(false);
connectThread=new Thread(new Runnable(){
@Override
public void run() {
try{
connectInterruptibly();
} catch (Exception e) {
messages.append("\nInterruptibleSocketTest.connectInterruptibly:\n"+e);
}
}
});
connectThread.start();
}
});
blockingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
interruptilButton.setEnabled(false);
blockingButton.setEnabled(false);
canncelButton.setEnabled(false);
connectThread=new Thread(new Runnable(){
@Override
public void run() {
try {
connectBlocking();
} catch (IOException e) {
messages.append("InterruptibleSocketTest.connectblocking"+e);
}
}
});
connectThread.start();
}
}); canncelButton =new JButton("Cancel");
canncelButton.setEnabled(false);
northpJPanel.add(canncelButton);
canncelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
connectThread.interrupt();
canncelButton.setEnabled(false); }
});
server =new TestServer();
new Thread(server).start(); }
/**
* 连接到服务器 终端I/O流 Interruptible
* @throws IOException
*/
public void connectInterruptibly()throws IOException{
messages.append("Interruptible:\n");
SocketChannel channel=SocketChannel.open(new InetSocketAddress("192.168.0.141", 514));
try {
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{
channel.close();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
messages.append("Channel closed\n");
interruptilButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
/**
* 连接到服务器 终端I/O流 Blocking
* @throws IOException
*/
public void connectBlocking()throws IOException{
messages.append("Blocking:\n\n");
Socket socket=new Socket("localhost",8189);
try {
in=new Scanner(socket.getInputStream());
while (!Thread.currentThread().isInterrupted()){
if(in.hasNextLine()){
String line=in.nextLine();
messages.append(line);
messages.append("\n");
}
}
}finally{
socket.close();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
messages.append("Socket closed\n");
interruptilButton.setEnabled(false);
}
});
}
}
/**
* 测试服务器监听8189端口 并返回标示给客户端
*/
class TestServer implements Runnable{
@Override
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 (Exception e) {
messages.append("\nTestServer.run:\n"+e);
}
} }
class TestServerHandler implements Runnable{
public TestServerHandler(Socket i){
incoming=i;
}
@Override
public void run() {
try {
OutputStream outputStream=incoming.getOutputStream();
PrintWriter out=new PrintWriter(outputStream,true/*autoFulsh*/);
while(counter<=100){
counter++;
if(counter<=10) out.print(counter);
Thread.sleep(100);
}
incoming.close();
messages.append("Closing Server\n");
} catch (Exception e) {
messages.append("\nTestServerHandler.run:\n"+e);
} }
private Socket incoming;
private int counter;
} private Scanner in;
private JTextArea messages=null;
private JButton interruptilButton,blockingButton,canncelButton;
private Thread connectThread;
private TestServer server; public static final int WIDTH=550;
public static final int HEIGHT=400;
}
网络---中断套接字Socket的更多相关文章
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- Java网络编程--套接字Socket
一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...
- c 网络与套接字socket
我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...
- java网络编程(二)可中断套接字
参考资料:java核心技术 卷II 为中断套接字操作,可使用java.nio包提供的SocketChannel类.可以使用如下方式打开SocketChannel: SocketChannel chan ...
- 传输模型,网络层次划分,三次握手,四次挥手,IP与端口,套接字socket
了解套接字之前,需要先了解基本的传输模型 其次,还需要了解网络的七层划分和四层结构 在python中,数据链路层相当于硬件层,python不需要了解,只用在传输层进行学习就足够了 其中,传输层分为TC ...
- 网络编程(二)--TCP协议、基于tcp协议的套接字socket
一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...
- 网络编程(二)——TCP协议、基于tcp协议的套接字socket
TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...
- Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()
前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...
随机推荐
- 生成.a文件步骤
1.新建一个Project 选择 iOS->Framework & Library ->Cocoa Touch Static Library点击Next-> 输入Produc ...
- nginx + php +mysql (适配thinkphp)
Nginx 单机配置 http://tengine.taobao.org/book/index.html (taobao book) http://ubuntuhandbook.org/index.p ...
- nth-of-type和nth-child的区别
看CSS3时发现了一个nth-of-type选择器,发现平时基本没见过用,就研究了一下,w3c是这样说明的: :nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素 ...
- Data Being Added Conflicts with Existing Data
While developing a page with multiple scrolls levels, and especially when using a grid, you may get ...
- [leetcode]_Path Sum I && II
都是考查DFS.经典回溯算法,问题在于我对该类型的代码不熟悉,目前以参考别人的代码,然后加上自己的实现为主,通过类似的题目加强理解. 一.给定一棵二叉树,判断是否存在从root到leaf的路径和等于给 ...
- windows实用技巧
电脑如今已经非常普及,不过目前大多数电脑系统都是Win7/Win8.1或者Win10.你真的对自己电脑系统了解吗?今天小编为大家分享13个实用电脑技巧,会这些电脑技巧才叫牛哦! 13个实用电脑技巧 一 ...
- ASCII码详解
ASCII码详解 ASCII码表 ASCII码大致可以分作三部分組成.第一部分是:ASCII非打印控制字符: 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 第一部分:ASCI ...
- 【原创】小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载五(给按钮加图标)
在范例5-4所使用的导航栏中,已经为按钮加入了图标的样式,但是当时并没有介绍按钮的图标究竟是怎么一回事.下面截取范例5-4中导航栏部分的代码: <divdata-role="foote ...
- JS实现浏览器的title闪烁
经常可以看见的title里面的消息提示,下面是JS的一种实现方法:主要是通过setTimeout方法设置一个定时器,切换消息提示,从而达title到消息提示的闪烁. <html> < ...
- java 复习
整型: byte 1 short 2 int 4 long 80b1001 1_233_32 1341414141414Ljava 没有无符号类型浮点型:float 4 double 812.2f 无 ...