网络---中断套接字Socket



  1 package socketpack_2;
2 import java.awt.BorderLayout;
3 import java.awt.EventQueue;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.io.IOException;
7 import java.io.OutputStream;
8 import java.io.PrintWriter;
9 import java.net.InetSocketAddress;
10 import java.net.ServerSocket;
11 import java.net.Socket;
12 import java.nio.channels.SocketChannel;
13 import java.util.Scanner;
14 import javax.swing.JButton;
15 import javax.swing.JFrame;
16 import javax.swing.JPanel;
17 import javax.swing.JScrollPane;
18 import javax.swing.JTextArea;
19 /**
20 * 网络 -可中断套接字
21 * @author Visec·Dana
22 */
23 public class InterruptibleSocketTest {
24 public static void main(String[] args) {
25 EventQueue.invokeLater(new Thread()
26 {
27 public void run(){
28 JFrame frame=new InterruptibleSocketFrame();
29 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
30 frame.setVisible(true);
31
32 }
33 }
34 );
35 }
36 }
37 class InterruptibleSocketFrame extends JFrame{
38 private static final long serialVersionUID = 1L;
39 public InterruptibleSocketFrame(){
40 setSize(WIDTH,HEIGHT);
41 setTitle("InterruptibleSocketTest");
42
43 JPanel northpJPanel =new JPanel();
44 add(northpJPanel,BorderLayout.NORTH);
45
46 messages=new JTextArea();
47 add(new JScrollPane(messages));
48 interruptilButton=new JButton("Interruptilbel");
49 blockingButton=new JButton("Blocking");
50
51 northpJPanel.add(interruptilButton);
52 northpJPanel.add(blockingButton);
53 interruptilButton.addActionListener(new ActionListener() {
54 @Override
55 public void actionPerformed(ActionEvent event){
56 interruptilButton.setEnabled(false);
57 blockingButton.setEnabled(false);
58 canncelButton.setEnabled(false);
59 connectThread=new Thread(new Runnable(){
60 @Override
61 public void run() {
62 try{
63 connectInterruptibly();
64 } catch (Exception e) {
65 messages.append("\nInterruptibleSocketTest.connectInterruptibly:\n"+e);
66 }
67 }
68 });
69 connectThread.start();
70 }
71 });
72 blockingButton.addActionListener(new ActionListener() {
73 @Override
74 public void actionPerformed(ActionEvent e) {
75 interruptilButton.setEnabled(false);
76 blockingButton.setEnabled(false);
77 canncelButton.setEnabled(false);
78 connectThread=new Thread(new Runnable(){
79 @Override
80 public void run() {
81 try {
82 connectBlocking();
83 } catch (IOException e) {
84 messages.append("InterruptibleSocketTest.connectblocking"+e);
85 }
86 }
87 });
88 connectThread.start();
89 }
90 });
91
92 canncelButton =new JButton("Cancel");
93 canncelButton.setEnabled(false);
94 northpJPanel.add(canncelButton);
95 canncelButton.addActionListener(new ActionListener() {
96 @Override
97 public void actionPerformed(ActionEvent e) {
98 connectThread.interrupt();
99 canncelButton.setEnabled(false);
100
101 }
102 });
103 server =new TestServer();
104 new Thread(server).start();
105
106 }
107 /**
108 * 连接到服务器 终端I/O流 Interruptible
109 * @throws IOException
110 */
111 public void connectInterruptibly()throws IOException{
112 messages.append("Interruptible:\n");
113 SocketChannel channel=SocketChannel.open(new InetSocketAddress("192.168.0.141", 514));
114 try {
115 in=new Scanner(channel);
116 while(!Thread.currentThread().isInterrupted()){
117 messages.append("Reading");
118 if(in.hasNextLine()){
119 String line=in.nextLine();
120 messages.append(line);
121 messages.append("\n");
122 }
123 }
124 }finally{
125 channel.close();
126 EventQueue.invokeLater(new Runnable() {
127 @Override
128 public void run() {
129 messages.append("Channel closed\n");
130 interruptilButton.setEnabled(true);
131 blockingButton.setEnabled(true);
132 }
133 });
134 }
135 }
136 /**
137 * 连接到服务器 终端I/O流 Blocking
138 * @throws IOException
139 */
140 public void connectBlocking()throws IOException{
141 messages.append("Blocking:\n\n");
142 Socket socket=new Socket("localhost",8189);
143 try {
144 in=new Scanner(socket.getInputStream());
145 while (!Thread.currentThread().isInterrupted()){
146 if(in.hasNextLine()){
147 String line=in.nextLine();
148 messages.append(line);
149 messages.append("\n");
150 }
151 }
152 }finally{
153 socket.close();
154 EventQueue.invokeLater(new Runnable() {
155 @Override
156 public void run() {
157 messages.append("Socket closed\n");
158 interruptilButton.setEnabled(false);
159 }
160 });
161 }
162 }
163 /**
164 * 测试服务器监听8189端口 并返回标示给客户端
165 */
166 class TestServer implements Runnable{
167 @Override
168 public void run() {
169 try {
170 ServerSocket s=new ServerSocket(8189);
171 while(true){
172 Socket incoming=s.accept();
173 Runnable r=new TestServerHandler(incoming);
174 Thread t=new Thread(r);
175 t.start();
176 }
177 } catch (Exception e) {
178 messages.append("\nTestServer.run:\n"+e);
179 }
180 }
181
182 }
183 class TestServerHandler implements Runnable{
184 public TestServerHandler(Socket i){
185 incoming=i;
186 }
187 @Override
188 public void run() {
189 try {
190 OutputStream outputStream=incoming.getOutputStream();
191 PrintWriter out=new PrintWriter(outputStream,true/*autoFulsh*/);
192 while(counter<=100){
193 counter++;
194 if(counter<=10) out.print(counter);
195 Thread.sleep(100);
196 }
197 incoming.close();
198 messages.append("Closing Server\n");
199 } catch (Exception e) {
200 messages.append("\nTestServerHandler.run:\n"+e);
201 }
202
203 }
204 private Socket incoming;
205 private int counter;
206 }
207
208 private Scanner in;
209 private JTextArea messages=null;
210 private JButton interruptilButton,blockingButton,canncelButton;
211 private Thread connectThread;
212 private TestServer server;
213
214 public static final int WIDTH=550;
215 public static final int HEIGHT=400;
216 }

网络---中断套接字Socket

时间: 2024-10-12 09:30:43

网络---中断套接字Socket的相关文章

网络编程 套接字socket 及 粘包

网络编程 套接字socket 及 粘包 sockt 初识 五层协议 : 从传输层包括传输层以下 , 都是操作系统帮我们封装的各种head socket套接字充当的就是内置模块的角色 socket 套接字,它存在于传输层与应用层之间的抽象层 避免你学习各层的接口以及协议的使用, socket已经封装好了所有的接口 . 直接使用这些接口或者方法即可 , 使用起来方便,提升开发效率 socket 就是一个模块 , 通过使用学习模块提供的功能 , 建立客户端与服务端的通信 套接字的工作流程(基于TCP和

java 网络编程-套接字Socket图

原文地址:https://blog.51cto.com/14437184/2432469

可中断套接字(网络)

当连接到一个套接字时,当前线程将会被阻塞直到建立连接或产生超时为止.同样地,当通过套接字读写数据时,当前线程也会被阻塞知道操作成功或产生超时为止. 在交互式的应用中,也许会考虑为用户提供一个选项,用以取消那些不会成功的连接.但是当线程因套接字长时间无法响应而发生阻塞时,无法通过调用interrupt来解除阻塞. 为了中断套接字操作,可以使用java.nio包提供的一个特性——SocketChannel 类.可以使用如下方法打开SocketChannel: SocketChannel channe

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

linux网络编程——套接字(socket)入门

1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* address族, AF_xxx */ char sa_data[14]; /* 14 bytes的协议地址 */ }; sa_family 一般来说,都是"AFINET". sa_data 包含了一些远程电脑的地址.端口和套接字的数目,它里面的数据是杂溶在一切的. 为了处理struct socka

专题七.网络编程之套接字Socket、TCP和UDP通信实例

https://blog.csdn.net/Eastmount/article/details/48909861 找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. https://www.cnblogs.com/alex3714/articles/5227251.html 1.Socket语法及相关 2.SocketSer

Linux进程间通信 -- 数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套接字 socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.也因为这样,套接字明确地将客户端和服务器区分开来. 相对于流套接字,数据报套接字的

回写、套接字socket 、JVM映像、实际/抽象回话

1.什么是回写? 回写:更新多维数据集单元值.成员或成员属性值. 操作系统和平台上的应用程序在运行的时候需要往磁盘写入临时数据,但是在无盘环境下,没有硬盘作为操作系统和应用程序临时的交换数据空间,所以这个任务必须交给服务器来完成 计算机回写:“Write Back(回写),在回写状态下,数据只有在要被从高速缓存中清除时才写到磁盘上.随着主存读取的数据增加,回写需要开始从高速缓存中向磁盘上写数据,并把更新的数据写入高速缓存中.由于一个数据可能会被写入高速缓存中许多次,而没有进行磁盘存取,所以回写的

Linux 网络编程——套接字的介绍

套接字是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信.我们可以用套接字中的相关函数来完成通信过程. 套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol). 套接字的域 域指定套接字通信中使用的网络介质.最常见的套接字域是 AF_INET,它是指 Internet 网络,许多 Linux 局域网使用的都是该网络,当然,因特网自身用的也是它. 套接字类型 流套接字(SOCK_STREAM): 流套接字用于提供面向连