动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.控制bean定制器的技巧.
.利用UML序列图设计Java应用程序详.
.VJ6.0的使用方法(4)Application调.
.设置Java的安全策略.
.用XML和Servlet构建在线问答系统.
.JAVA学习笔记swingJFrame窗口学习.
.数据库乱码解决方案.
.Enterprise JavaBeans导论1.
.Java的事件处理.
.建立Java的应用程序.
.J2ME与Web Service-KSOAP快速上手.
.回眸:Java改变了什么?.
.图解Adapter模式.
.投票系统制作基本模式.
.构建可扩展的Java图表组件.
.《Effective Java》学习笔记(4).
.手机开发 教您使用JSR172解析XML.
.Java 套接字(Socket).
.在Applet中实现事件响应.
.Java基础入门:关于Java构造器.

比尔学Java:JavaSocket篇

发表日期:2008-1-5 |



  比尔最近接到一个项目,是要在原来的系统上实现客户端与服务器的连接。原来的系统是用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
上一篇:Java技巧:用Java保存位图文件 人气:586
下一篇:Java基本语法(二)——变量和常量 人气:663
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-11-21 AutoIndex v2.2.4 多国语言版
2008-11-21 ASBLOG v2.5 bulid 081118
2008-11-21 phpwebsite v1.60
2008-11-21 DreamArticle 文章管理系统 v3.0
2008-11-21 DreamArticle 文章管理系统 v3.0
2008-11-21 Piwik ( PHP统计系统,可以和GOOG
2008-11-21 CMS001 v2.2 Beta
2008-11-21 magento开源电子商务平台 v1.1.7
2008-11-21 开良马克思影视下载插件 v1.1
2008-11-21 傲游(Maxthon) 2.1.5 正式版
2008-11-21 Skype v3.8.0.188 Final
2008-11-21 AirPlay OpenAlpha 2008.11.20
2008-11-21 屏幕文字抓取工具 DWMouse1.3.510
2008-11-21 Vista一键还原(Vista Ghost)1.
2008-11-21 SP Photo Fix照片修改1.2破解版
2008-11-21 QQ腾讯聊天工具 v1.2正式版
2008-11-21 FlightTrack航班信息v1.0破解版
2008-11-21 RealPiano仿真钢琴1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成