`

i am begining

阅读更多

读书笔记:

       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源码(iphone 学习源码)

    Begining iphone 3源码,光看书不行,自己巧代码有可能哪里出错了,也不知道,有了源码,对照着,看自己哪里错误了,很方便。 (本着负责任的态度,这个资源目前不能正常使用,请不要下载) ------火大,想更新资源都...

    begining cSharp2008(英文版)

    《 Beginning C# 2008》是一本专为初学者设计的编程教材,它以英文版的形式提供了全面且深入的C#语言学习指南。这本书是面向那些希望通过学习C#来进入.NET框架开发领域的读者,同时也适合那些希望提升英语阅读能力的...

    begining iphone development

    《初识iPhone开发》是针对苹果公司的移动设备——iPhone进行应用程序开发的一本入门教程,它在Amazon计算机类书籍中名列前茅,表明其在该领域的权威性和受欢迎程度。这本书旨在引导读者踏入iOS开发的世界,掌握Apple...

    Begining iPhone Game Development.pdf+书籍代码

    《初识iPhone游戏开发》是一本专为iOS平台游戏开发新手设计的指南,结合了理论与实践,旨在帮助读者从零开始掌握iPhone游戏的开发流程。这本书的核心内容围绕着使用苹果的Swift编程语言和强大的游戏引擎如Unity或...

    Begining Linux Programing 4th

    《初识Linux编程》第四版是一本面向初学者的Linux编程指南,涵盖了C语言、Perl以及Shell脚本等核心技术。本书旨在帮助读者深入理解Linux操作系统环境下的编程实践,为后续的系统开发和软件工程奠定坚实基础。...

    Apress.Begining EJB3 Java EE 7 Edition.2013

    ### 企业级应用开发:《Apress.Begining EJB3 Java EE 7 Edition.2013》核心知识点解析 #### 一、书籍概述 **标题与描述:**《Apress.Begining EJB3 Java EE 7 Edition.2013》是一本面向初学者介绍如何使用EJB3...

    Begining Visual C++ 2005

    《Begining Visual C++ 2005》是面向初学者的一本经典教程,它旨在帮助读者快速掌握Microsoft的Visual C++ 2005开发环境。这本书详细介绍了如何使用这个强大的工具集来构建Windows应用程序,包括桌面应用、图形用户...

    Begining Visual C++ 2008(英文原版)

    5. **文件I/O操作**:介绍如何读写文件,这是许多应用程序都需要的功能。C++提供fstream库来处理这些任务。 6. **MFC框架**:对于Windows应用开发,MFC是一个关键组件。书中会讲解如何使用MFC创建用户界面,处理...

    Begining DirectX9 随书源码

    "Begining DirectX9 随书源码"是配合某本关于DirectX9入门教程的源代码集合,旨在帮助初学者通过实际操作来理解和学习DirectX9的基本概念和技术。 在DirectX9中,主要包含以下几个核心组件: 1. Direct3D:这是...

    begining linux programing 3rd

    书中还会涵盖与文件I/O、内存管理和错误处理相关的主题,这些都是开发高效、可靠的Linux应用程序的关键。此外,还将讨论多线程编程,使读者了解如何利用并发性提高程序性能。同时,网络编程也是现代Linux应用不可或...

    begining with C++ 2010

    《Beginning with C++ 2010》是一本针对初学者和希望提高编程技能的读者的入门指南,由Ivor Horton编著。本书全面介绍了C++语言,特别是2010年版的Visual C++环境下的应用开发。Ivor Horton是Java、C以及C++编程语言...

    begining groovy and grails

    《初学者指南:Groovy与Grails》一书由Christopher M. Judd、Joseph Faisal Nusairat和James Shingler共同编写,是专为Java开发者设计的实用教程,旨在帮助他们掌握敏捷Web开发所需的Groovy和Grails技能。...

    begining unix 基础操作

    【Unix基础操作详解】 Unix操作系统是一种强大的多用户、多任务的操作系统,广泛应用于科学计算、服务器管理和网络设备等。本文将详细介绍Unix的基础操作,包括登录、远程登录、系统信息查看、退出与关闭系统、联机...

    Begining SQL Server 2012 for developer

    根据提供的文件信息,以下是对“Begining SQL Server 2012 for developer”书籍内容的知识点梳理。 ### SQL Server 2012 基础 SQL Server是微软公司推出的数据库管理系统,SQL Server 2012是该系列的一个版本。...

    Begining Hibernate 5

    《Begining Hibernate 5》是基于Hibernate5框架的教程书籍,第四版,作者是Joseph B. Ottinger、Jeff Linwood和Dave Minter。这本书为读者提供了全面的介绍和实践指导,旨在帮助开发者从零开始掌握Hibernate 5的技术...

    begining xml with C# 2008

    根据提供的文件信息,我们可以从《Beginning XML with C# 2008: From Novice to Professional》这本书中提炼出以下几个重要的知识点: ### 一、XML基础 #### XML简介 XML(Extensible Markup Language)是一种标记...

    Begining VC 2008

    《Begining VC 2008》是一本深入讲解如何使用Visual C++ 2008进行编程的书籍,由Ivor Horton编写,是学习C++及Visual C++环境下的程序设计的重要参考资料。本书全面覆盖了从基础概念到高级主题的广泛知识,适合初学...

    Begining SQL

    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 ...

Global site tag (gtag.js) - Google Analytics