`
txyly998
  • 浏览: 111436 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

我的Java Socket学习历程

    博客分类:
  • java
阅读更多
最近接到一个项目,是要在原来的系统上实现客户端与服务器的连接。原来的系统是用Java开发的,项目组讨后,决定应用Java提供的Socket类来解决问题。比尔是C开发的高手,对Java却只略知皮毛。所以,我一头扎进Java中,开始他的学习历程。当然,首先还要解决眼前的问题,学习Socket编程。
  在学习Socket编程之前,先看看自己是否熟悉TCP、UDP、Ports等网络基本概念,要是还不熟悉的话就得先去补补课罗!
  Socket 的基本概念
  1、Socket,也就是俗称的套接字。
  2、Sun Java中的定义:是运行在网络上的两个程序间双向通讯连接的末端,它提供客户端和服务器端的连接通道。Socket绑定于特定端口这样TCP层就知道将数据提供给哪个应用程序。
  3、字面上的理解,Socket的意思是"插座、孔",你还可以把它形象地理解为打电话用的电话机,你从听筒里听到对方声音,同时将声音通过话筒传给对方。
  
  我想你现在和我刚开始的时候一样:好像有点明白,又好像不是很明白,没关系,我希望通过下面例子的讲解你能够彻底地掌握它。在实例之前,让我们先来看看Socket实现的基本原理。
  Socket编程实现原理
  从连接的建立到连接的结束,每个Socket应用都大致包含以下几个基本步骤:
  1、服务器端socket绑定于特定端口,服务器侦听socket等待连接请求;
  2、客户端向服务器和特定端口提交连接请求;
  3、服务器接受连接,产生一新的socket,绑定到另一端口,由此socket来处理和客户端的交互,服务器继续侦听原socket来接受其他客户端的连接请求;
  
  4、连接成功后客户端也产生一socket,并通过它来与服务器端通讯(注意:客户端socket并不与特定端口绑定);
  5、接下来,服务器端和客户端就通过读取和写入各自的socket来进行通讯。
  注意:本文中只讲解基于TCP的Socket应用
  Java中的Socket类
  Java中提供两个类(在java.net包中)——Socket和ServerSocket来分别实现客户端和服务器端Socket。但Socket的实际工作是由抽象类SocketImpl的实例来完成的,这其实是设计模式中Abstract Factory模式的一个应用。
  
  ServerSocket类的常用构造器和主要方法:
  
  ServerSocket(int port) 在指定的端口号上产生一服务器端socket
  Socket accept()
  侦听socket,接受连接
  Socket类的常见构造器和主要方法:
  
  Socket(String host, int port) 生成一socket并连接至指定的主机和端口



  InputStream getInputStream() 返回socket的输入流
  OutputStream getOuputStream() 返回socket的输出流
  一个客户服务器实例
  了解了上面的一些基本知识以后,我想大家现在都迫不及待地想亲自动手编写自己的socket,那就让我们开始吧!在这个例子中,我们模仿了一个Echo服务,它侦听3333端口。客户端接受用户键盘输入并向服务器端发出连接请求,服务器端接受客户端连接,连接成功后建立会话,客户端于是向服务器端发送用户输入信息,服务器端接收此信息并且简单返回给客户端。源码如下:
  
  (服务器端)
  
  /**
   * <p>Title:EchoServer.java </p>
   * <p>Description: EchoServer create a echo-like server at port 3333</p>
   * @author Mac
   * @version 2002/9/2
   */
  
  import java.net.*;
  import java.io.*;
  
  public class EchoServer
  {
   public static void main (String[] args) throws IOException
   {
   ServerSocket echoServer = null;
   try
   {
   echoServer = new ServerSocket(3333); //creat a server socket at port
  3333(问题一)
   }
   catch(IOException e)
   {
   System.err.println("Couldn"t listen on port:3333");
   System.exit(-1);
   }
  
   Socket echoClient = null;
   try
   {
   echoClient = echoServer.accept(); //accept a connection
   }
   catch(IOException e)
   {
   System.err.println("IO error:" + e.getMessage());
   System.exit(-1);
   }
  
   PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);
   //gets the socket"s output stream and opens a PrintWriter on it
   //if you remove the argument true,what will happen?(问题三)
   BufferedReader in = new BufferedReader(
   new InputStreamReader(echoClient.getInputStream()));
   //gets the socket"s input stream and opens a BufferedReader on it
   String strFromClient;
  
   while((strFromClient = in.readLine()) != null)
   {
   out.println("result is :" + strFromClient);
   }
  
   in.close();
   out.close();
   echoClient.close();
   echoServer.close();
   }
  }
  
  (客户端)
  /**
   *<p>Title:EchoClient.java </p>
   *<p>Description: EchoClient creates a socket thereby getting a connection to
  echo-like server</p>
   * @author Mac Wang
   * @version 2002/8/30
   */
  
  import java.net.*;
  import java.io.*;
  
  public class EchoClient
  {
  
   public static void main(String[] args)
   {
   try
   {
  Socket echoClient = new Socket("yourhostname",3333);
  //creat a new socket connected to host and port 3333
   PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);
  
   BufferedReader in = new BufferedReader(
   new InputStreamReader(echoClient.getInputStream()));
   String fromServer,fromUser;
   BufferedReader stdIn = new BufferedReader(
   new InputStreamReader(System.in));
   //gets the system input stream and opens a BufferedReader on it
   while ((fromUser = stdIn.readLine()) != null)
   {
   if (fromUser.equals("bye")) break;
  //when user types "bye" then end
  
   System.out.println("input is:" + fromUser);
   out.println(fromUser);
  
   fromServer = in.readLine();
   System.out.println(fromServer);
   }
   out.close();
   in.close();
   echoClient.close();
   }
   catch(UnknownHostException e)
   {
   System.err.println("Unknown host:yourhostname");
   System.exit(1);
   }
   catch(IOException e)
   {
   System.err.println("I/0 error:" + e.getMessage());
   System.exit(1);
   }
   }
  }
  现在可以分别运行Server和Client,看看程序运行效果(注意:你必须将yourhostname替换成你自己的主机名或IP地址)。并且思考以下几个问题:
  
  1、把端口号换成2222后看看程序运行效果?那么89呢?是不是任何数字都可以呢?
  
  2、如果不采用我们自己编写的echo server,而是连接到系统本身提供的echo server(端口号为7),试试看会发生什么情况,客户端Socket是否需要改变呢?
  
  3、去掉PrintWriter中的参数True,看看程序运行的效果?
  
  4、注意程序中是如何读取和写入Socket的?
  5、试着多打开几个客户端,看看效果如何?
  从问题5中大家可以看出来,上面的例子只支持一个用户连接,那么如何支持多用户的同时访问呢?最简单有效的方法就是利用多线程实现,每个线程对应一个用户连接,server接受一个client连接后,就新产生一个线程,并交由它去处理余下的工作。下面就是支持多用户的服务器端实现:

  /**
  *<p>Title:EchoMultiServer </p>
   *<p>Description: EchoServer create a echo-like server at port 3333 which supports
  multi-client</p>
   * @author Mac Wang
   * @version 2002/9/2
   */
  import java.net.*;
  import java.io.*;
  class EchoMultiServerThread extends Thread
  {
   private Socket echoClient = nul

文章来自[SVN中文技术网]转发请保留本站地址:http://www.svn8.com/java/Socket/20080927/1022.html
分享到:
评论

相关推荐

    JAVA SOCKET+swing在netbeans6.0中的实现历程

    在这个"JAVA SOCKET+swing在netbeans6.0中的实现历程"的例子中,我们将深入探讨如何使用Java Socket和Swing库在NetBeans 6.0集成开发环境中创建一个简单的客户端-服务器应用程序。 首先,`Server.java`文件通常包含...

    记录JavaSE学习历程 Java学习资料

    7. **网络编程**:Java提供了丰富的网络编程API,如Socket和ServerSocket,可以用来创建客户端和服务器应用程序,进行TCP/IP通信。 8. **反射机制**:Java反射机制允许在运行时动态访问类的信息,如类名、方法名、...

    Java最佳学习路线图

    ### Java最佳学习路线图 Java作为一种广泛使用的编程语言,在软件开发领域占据着极其重要的位置。对于初学者而言,制定一个合理的学习计划对于掌握这门语言至关重要。以下是对给定文件内容进行整理后的Java学习路线...

    java个人学习的日志

    对于网络编程,Java的Socket API提供了创建客户端和服务端应用的能力,这在日志中可能有所体现,特别是对于网络通信的实现和数据交换的理解。 另外,日志可能还会包含对Java输入输出系统的学习,包括文件操作、流的...

    基于Java聊天室的socket设计和实现.docx

    Java聊天室是基于Socket通信协议实现的一种在线交流平台,它允许用户通过网络进行实时文本、音频或视频对话。本文档详细介绍了如何设计和实现一个基于Java的聊天室系统,涵盖了Socket编程的基础、实现原理以及相关的...

    Java入门学习PPT

    1. **Java历史与特性**:介绍Java的发展历程,由Sun Microsystems的詹姆斯·高斯林创立,以及其主要特性,如“一次编写,到处运行”的理念,平台独立性,垃圾回收机制,和强大的类库支持。 2. **Java环境搭建**:...

    java基础 Java开发入门到精通PPT课件 共353页.ppt

    Java的发展历程中,从早期的Oak语言,经过Java 1.2、1.3、1.4,直到Java 5.0(也称为Java SE 5.0),再到现在的Java 11等版本,不断演进和完善。Java分为三个主要平台:Java SE(标准版),适用于桌面应用和服务器端...

    java学习笔记 JDK6 附代码

    Java编程语言是面向对象的、跨平台的编程语言,广泛应用于企业级应用开发、移动...同时,由于是基于JDK6,学习者也可以了解到早期版本的Java特性和当时编程的习惯,这对于理解后续版本的变化和发展历程具有重要意义。

    java学习笔记JDK6课件和课本代码

    1. JDK6概述:JDK6是Java发展历程中的一个重要版本,它的全称是Java SE 6(Java Standard Edition 6)。这个版本引入了许多新特性和改进,包括增强的Swing组件、改进的动态代理、更强大的脚本支持、新的I/O API以及...

    S.SOCKET编程,Java网络编程(上)

    Java网络编程是开发分布式应用程序的关键组成部分,而S.SOCKET编程是Java中实现网络通信的核心机制。...通过学习S.Socket编程,开发者能够创建自己的客户端和服务器端程序,实现数据的可靠交换,从而充分利用网络资源。

    Java学习路线和规划

    - **Socket编程**:学习如何使用Socket类进行网络通信。 - **TCP/UDP协议基础应用**:理解TCP和UDP两种协议的特点,并能够实现简单的客户端和服务端程序。 10. **反射与注解** - **反射机制**:掌握Class类和...

    Java学习规划.pdf

    1. **计算机基本原理与Java语言历史**:了解计算机工作原理,理解Java的诞生背景和发展历程,熟悉Java开发环境的搭建,包括JDK的安装和配置。 2. **开发环境与工具**:学习如何设置环境变量,理解程序的执行过程。...

    java-net-ant.rar_antnet_java学习软件_www netant c_网络蚂蚁

    通过分析和运行其中的代码,学习者可以了解Java网络编程的基本概念,如Socket通信、多线程下载管理,以及如何使用Ant进行项目构建。同时,通过阅读源码和示例,可以加深对Java编程和项目组织结构的理解。

    Java基础教程

    通过本文档的学习,您不仅能够掌握Java的基本语法和特性,还能了解到如何配置开发环境、编写简单的程序,并对Java的发展历程有更深入的理解。随着学习的深入,您还可以进一步探索面向对象编程的高级特性,为成为一名...

    Java完全自学宝典

    1.1 Java简介:了解Java的发展历程,由Sun Microsystems(现Oracle公司)推出,其跨平台特性由"Write Once, Run Anywhere"(一次编写,到处运行)的理念体现。 1.2 Java环境搭建:包括JDK(Java Development Kit)的...

    基于JAVA的剪刀石头布游戏设计——Java课程设计报告_.pdf

    5. Java历史和应用:文档中提到了一些Java的发展历程和应用,如HotJava浏览器和Java Applet。Java Applet是一个可以在支持Java的浏览器中运行的小型Java应用程序。它们在20世纪90年代到21世纪初非常流行,用于实现...

    Java 2 Java 2

    这个版本在Java发展历程中具有重要的地位,它引入了许多新特性,提升了性能和可扩展性,使得Java成为了企业级应用开发的首选语言。在本篇中,我们将深入探讨Java 2平台的核心组成部分,特别是与描述中提及的"图形...

    JAVA学习笔记JDK6课件含演示代码

    本资料集合主要关注的是JDK 6版本的学习笔记和相关课件,这一版本在2006年发布,是Java发展历程中的一个重要里程碑。 1. **Java基础知识**:Java是一种面向对象的语言,它的核心特性包括平台无关性、自动内存管理...

    武汉大学JAVA教程

    1. Java的发展历程 - 1991年,Sun Microsystems成立了秘密项目"The Green Project",目标是开发消费电子产品。 - 1992年,项目团队开发出名为"Oak"的语言,旨在服务有线电视市场。 - 随着互联网的崛起,项目团队...

Global site tag (gtag.js) - Google Analytics