读书笔记:
socket连接应用算是java底层连接了,如果有对应的解决,应避免,如线程的底层条件锁和内部对象锁,应避免,可以使用阻塞队列也实现同步。
Socket 感觉就是端口连接程序。
已经有的scoket测试工具是telnet.
SocketAddress 就是端口地址
|
有个子类为:InetSocketAddress
| |
| |
分InetAddress 端口
所以一个socket建立平时要InetSocketAddress,
它个构造方法有 Socket(String host, int port)
Socket(InetAddress address, int port)
也可以有先建立一个没有指定的,在事后指定,也有相关本地接口的。
获得一个连接 可以获得它的输入和输出流。
输入流为读取,输出流为向服务器端写入数据。
ServerSocket为实现服务器端类。
若想可以连续的接受客户端的连接可以
while(true)
{
socket=serverSocket.accept();
new Thread(new Runnable(socket)).start();
}
为每一个来的客户端提供一个线程为它服务。
半关闭的socket
socket.shutdownInput();
socket.shutdownOutput();
当建立一个Socket程序时,可能阻塞,同理当套接字读取数据也肯能阻塞,这时 可先建一个空的套接字,在设置hostName 和port 加上超时时间参数。
对于读取的阻塞可有SocketChannel 来解决,
package v2chapter03.InterruptibleSocketTest;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import javax.swing.*;
/**
* This program shows how to interrupt a socket channel.
* @author Cay Horstmann
* @version 1.01 2007-06-25
*/
public class InterruptibleSocketTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new InterruptibleSocketFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class InterruptibleSocketFrame extends JFrame
{
public InterruptibleSocketFrame()
{
setSize(WIDTH, HEIGHT);
setTitle("InterruptibleSocketTest");
JPanel northPanel = new JPanel();
add(northPanel, BorderLayout.NORTH);
messages = new JTextArea();
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);
cancelButton.setEnabled(true);
connectThread = new Thread(new Runnable()
{
public void run()
{
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);
cancelButton.setEnabled(true);
connectThread = new Thread(new Runnable()
{
public void run()
{
try
{
connectBlocking();
}
catch (IOException e)
{
messages.append("\nInterruptibleSocketTest.connectBlocking: " + e);
}
}
});
connectThread.start();
}
});
cancelButton = new JButton("Cancel");
cancelButton.setEnabled(false);
northPanel.add(cancelButton);
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
connectThread.interrupt();
cancelButton.setEnabled(false);
}
});
server = new TestServer();
new Thread(server).start();
}
/**
* Connects to the test server, using interruptible I/O
*/
public void connectInterruptibly() throws IOException
{
messages.append("Interruptible:\n");
SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 8189));
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()
{
public void run()
{
messages.append("Channel closed\n");
interruptibleButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
/**
* Connects to the test server, using blocking I/O
*/
public void connectBlocking() throws IOException
{
messages.append("Blocking:\n");
Socket sock = new Socket("localhost", 8189);
try
{
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
{
sock.close();
EventQueue.invokeLater(new Runnable()
{
public void run()
{
messages.append("Socket closed\n");
interruptibleButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
/**
* A multithreaded server that listens to port 8189 and sends numbers to the client, simulating a
* hanging server after 10 numbers.
*/
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);
}
}
}
/**
* This class handles the client input for one server socket connection.
*/
class TestServerHandler implements Runnable
{
/**
* Constructs a handler.
* @param i the incoming socket
*/
public TestServerHandler(Socket i)
{
incoming = i;
}
public void run()
{
try
{
OutputStream outStream = incoming.getOutputStream();
PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
while (counter < 100)
{
counter++;
if (counter <= 10) out.println(counter);
Thread.sleep(100);
}
incoming.close();
messages.append("Closing server\n");
}
catch (Exception e)
{
messages.append("\nTestServerHandler.run: " + e);
}
}
private Socket incoming;
private int counter;
}
private Scanner in;
private JButton interruptibleButton;
private JButton blockingButton;
private JButton cancelButton;
private JTextArea messages;
private TestServer server;
private Thread connectThread;
public static final int WIDTH = 300;
public static final int HEIGHT = 300;
}
程序在前十个输出时,点击cancel按钮 都会使客户端阻塞,但是在10后有一段时间服务器是阻塞的,这时候只有SocketChannel 可以立即使客户端阻塞,客户端阻塞不影响,服务器端,服务器端依然会继续执行直到,结束。如果在服务器端:
if (counter <= 10) out.println(counter);
{
System.out.println("休息中。。。");
Thread.sleep(100);
}
可以发现服务器端一直会输出,如果100结束后,服务器端关闭,但是不点击cannel 那么客户端 不会阻塞,会一直输出reading.也就是说 客户端和服务器不是统一的,要是服务器端线程阻塞了,那么会阻塞客户端(如果是channel就不会影响),但是客户端阻塞不会影响服务器端,
分享到:
相关推荐
Begining iphone 3源码,光看书不行,自己巧代码有可能哪里出错了,也不知道,有了源码,对照着,看自己哪里错误了,很方便。 (本着负责任的态度,这个资源目前不能正常使用,请不要下载) ------火大,想更新资源都...
《 Beginning C# 2008》是一本专为初学者设计的编程教材,它以英文版的形式提供了全面且深入的C#语言学习指南。这本书是面向那些希望通过学习C#来进入.NET框架开发领域的读者,同时也适合那些希望提升英语阅读能力的...
《初识iPhone开发》是针对苹果公司的移动设备——iPhone进行应用程序开发的一本入门教程,它在Amazon计算机类书籍中名列前茅,表明其在该领域的权威性和受欢迎程度。这本书旨在引导读者踏入iOS开发的世界,掌握Apple...
《初识iPhone游戏开发》是一本专为iOS平台游戏开发新手设计的指南,结合了理论与实践,旨在帮助读者从零开始掌握iPhone游戏的开发流程。这本书的核心内容围绕着使用苹果的Swift编程语言和强大的游戏引擎如Unity或...
《初识Linux编程》第四版是一本面向初学者的Linux编程指南,涵盖了C语言、Perl以及Shell脚本等核心技术。本书旨在帮助读者深入理解Linux操作系统环境下的编程实践,为后续的系统开发和软件工程奠定坚实基础。...
### 企业级应用开发:《Apress.Begining EJB3 Java EE 7 Edition.2013》核心知识点解析 #### 一、书籍概述 **标题与描述:**《Apress.Begining EJB3 Java EE 7 Edition.2013》是一本面向初学者介绍如何使用EJB3...
《Begining Visual C++ 2005》是面向初学者的一本经典教程,它旨在帮助读者快速掌握Microsoft的Visual C++ 2005开发环境。这本书详细介绍了如何使用这个强大的工具集来构建Windows应用程序,包括桌面应用、图形用户...
5. **文件I/O操作**:介绍如何读写文件,这是许多应用程序都需要的功能。C++提供fstream库来处理这些任务。 6. **MFC框架**:对于Windows应用开发,MFC是一个关键组件。书中会讲解如何使用MFC创建用户界面,处理...
"Begining DirectX9 随书源码"是配合某本关于DirectX9入门教程的源代码集合,旨在帮助初学者通过实际操作来理解和学习DirectX9的基本概念和技术。 在DirectX9中,主要包含以下几个核心组件: 1. Direct3D:这是...
书中还会涵盖与文件I/O、内存管理和错误处理相关的主题,这些都是开发高效、可靠的Linux应用程序的关键。此外,还将讨论多线程编程,使读者了解如何利用并发性提高程序性能。同时,网络编程也是现代Linux应用不可或...
《Beginning with C++ 2010》是一本针对初学者和希望提高编程技能的读者的入门指南,由Ivor Horton编著。本书全面介绍了C++语言,特别是2010年版的Visual C++环境下的应用开发。Ivor Horton是Java、C以及C++编程语言...
《初学者指南:Groovy与Grails》一书由Christopher M. Judd、Joseph Faisal Nusairat和James Shingler共同编写,是专为Java开发者设计的实用教程,旨在帮助他们掌握敏捷Web开发所需的Groovy和Grails技能。...
【Unix基础操作详解】 Unix操作系统是一种强大的多用户、多任务的操作系统,广泛应用于科学计算、服务器管理和网络设备等。本文将详细介绍Unix的基础操作,包括登录、远程登录、系统信息查看、退出与关闭系统、联机...
根据提供的文件信息,以下是对“Begining SQL Server 2012 for developer”书籍内容的知识点梳理。 ### SQL Server 2012 基础 SQL Server是微软公司推出的数据库管理系统,SQL Server 2012是该系列的一个版本。...
《Begining Hibernate 5》是基于Hibernate5框架的教程书籍,第四版,作者是Joseph B. Ottinger、Jeff Linwood和Dave Minter。这本书为读者提供了全面的介绍和实践指导,旨在帮助开发者从零开始掌握Hibernate 5的技术...
根据提供的文件信息,我们可以从《Beginning XML with C# 2008: From Novice to Professional》这本书中提炼出以下几个重要的知识点: ### 一、XML基础 #### XML简介 XML(Extensible Markup Language)是一种标记...
《Begining VC 2008》是一本深入讲解如何使用Visual C++ 2008进行编程的书籍,由Ivor Horton编写,是学习C++及Visual C++环境下的程序设计的重要参考资料。本书全面覆盖了从基础概念到高级主题的广泛知识,适合初学...
SQL语言入门教材,英文版,亚马逊4星,网站介绍摘要: Editorial Reviews Product Description Taking readers through the basics of the language, right up to some more advanced topics, this book is a ...