??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人亚洲综合,欧美色就是色,欧美色综合一区二区三区http://www.aygfsteel.com/mlxlzc/category/34725.htmlzh-cnThu, 25 Sep 2008 09:57:34 GMTThu, 25 Sep 2008 09:57:34 GMT60MINA 使用 Apache MINA 开发高性能|络应用E序(IBM)http://www.aygfsteel.com/mlxlzc/articles/231121.htmlgotogotoThu, 25 Sep 2008 07:23:00 GMThttp://www.aygfsteel.com/mlxlzc/articles/231121.htmlhttp://www.aygfsteel.com/mlxlzc/comments/231121.htmlhttp://www.aygfsteel.com/mlxlzc/articles/231121.html#Feedback0http://www.aygfsteel.com/mlxlzc/comments/commentRss/231121.htmlhttp://www.aygfsteel.com/mlxlzc/services/trackbacks/231121.html本文通过一个简单的问候程?HelloServer 来介l?MINA 的基架构的同时演C如何?MINA 开发网l应用程序?/blockquote>

Apache MINA(Multipurpose Infrastructure for Network Applications) ?Apache l织一个较新的目Q它为开发高性能和高可用性的|络应用E序提供了非怾利的框架。当前发行的 MINA 版本支持Z Java NIO 技术的 TCP/UDP 应用E序开发、串口通讯E序Q只在最新的预览版中提供Q,MINA 所支持的功能也在进一步的扩展中?/p>

? 前正在?MINA 的Y件包括有QApache Directory Project、AsyncWeb、AMQPQAdvanced Message Queuing ProtocolQ、RED5 ServerQMacromedia Flash Media RTMPQ、ObjectRADIUS、Openfire {等?/p>

本文通过一个简单的问候程?HelloServer 来介l?MINA 的基架构的同时演C如何用MINA 开发网l应用程序?/p>

环境准备

  1. 首先到官方网站下载最新的 MINA 版本Q地址是:http://mina.apache.org/downloads.html? 下蝲之前先介l一?MINA 的两个版本:1.0.x 适合q行环境?JDK1.4Q?.1.x 适合 JDK1.5 的版本,两者的~译环境都需?JDK1.5。JDK1.5 已经是非常普遍了Q本文中使用 1.1.5 版本?MINAQ编译和q行所需的文件是 mina-core-1.1.5.jar?/li>
  2. 下蝲 MINA 的依赖包 slf4j。MINA 使用此项目作为日志信息的输出Q?MINA 本nq不附带此项目包Q请?a >http://www.slf4j.org/download.html 地址下蝲 slf4j 包,slf4j 目解压后有很多的文Ӟ本例中只需要其中的 slf4j-api-1.4.3.jar ? slf4j-simple-1.4.3.jar q两?jar 文g。如果没有这两个文g׃D启动例子E序的时候报 org/slf4j/LoggerFactory cL扑ֈ的错误?/li>
  3. 当然要求机器上必装?1.5 或者更新版本的 JDK?/li>
  4. 最好你应该选择一个顺手的 Java 开发环境例?Eclipse 或?NetBeans 之类的,可以更方便的~码和调试,虽然我们的最低要求只是一个简单的文本~辑器而已?/li>




回页?/strong>


  • ~写代码 HelloServer.java 如下
  • package demo.mina.echo;

                

                
    import java.io.IOException;

                
    import java.net.InetSocketAddress;

                

                
    import org.apache.mina.common.*;

                
    import org.apache.mina.transport.socket.nio.*;

                
    import org.apache.mina.filter.codec.ProtocolCodecFilter;

                
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

                

                
    /**

                * HelloServer演示E序

                * 
    @author liudong (

                
    http://www.dlog.cn/javayou

                )

                
    */

                
    public class HelloServer {

                

                
    private static final int PORT = 8080;

                
    /**

                * 
    @param args

                * 
    @throws IOException 

                
    */

                
    public static void main(String[] args) throws IOException {

                IoAcceptor acceptor 
    = new SocketAcceptor();        

                IoAcceptorConfig config 
    = new SocketAcceptorConfig();

                DefaultIoFilterChainBuilder chain 
    = config.getFilterChain();

                
    //使用字符串编?/span>

                chain.addLast(
    "codec"

                
    new ProtocolCodecFilter(new TextLineCodecFactory()));

                
    //启动HelloServer

                acceptor.bind(
    new InetSocketAddress(PORT), new HelloHandler(), config);

                System.out.println(
    "HelloServer started on port " + PORT);

                }

                }

                

                
    /**

                * HelloServer的处理逻辑

                * 
    @author liudong

                
    */

                
    class HelloHandler extends IoHandlerAdapter {

                
    /**

                * 当有异常发生时触?br />
                
    */

                @Override

                
    public void exceptionCaught(IoSession ssn, Throwable cause) {

                cause.printStackTrace();

                ssn.close();

                }

                

                
    /**

                * 有新q接时触?br />
                
    */

                @Override

                
    public void sessionOpened(IoSession ssn) throws Exception {

                System.out.println(
    "session open for " + ssn.getRemoteAddress());

                }

                

                
    /**

                * q接被关闭时触发

                
    */

                @Override

                
    public void sessionClosed(IoSession ssn) throws Exception {

                System.out.println(
    "session closed from " + ssn.getRemoteAddress());

                }

                

                
    /**

                * 收到来自客户端的消息

                
    */

                
    public void messageReceived(IoSession ssn, Object msg) throws Exception {    

                String ip 
    = ssn.getRemoteAddress().toString();

                System.out.println(
    "===> Message From " + ip +" : " + msg);    

                ssn.write(
    "Hello " + msg);

                }

                }

    1. ~译执行

    先不用试着去读懂每一行代码的具体意思,用你手的编译器~译 HelloServer.javaQ如果报错请认是否已将前面提到的三?jar 文gd至类路径中。如果一切顺利接着可以启动HelloServer E序Q启动后提示Q?code>HelloServer started on port 8080 表示启动成功Q如果启动失败,问题无外乎是cL扑ֈ或者端口占用。如果端口被占用的话Q换一个罗Q修?PORT 帔R值后再次~译q启动?/p>

    1. 试服务?/li>

    打开命o行窗口,输入 telnet localhost 8080 后,输入您的英文名或者其他一些ؕ七八p的字符后回车再ȝ看刚启动的服务程序有何反应。我的反应如下:

    HelloServer started on port 8080
    session open for /127.0.0.1:3023
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :liudong
    ===> Message From /127.0.0.1:3023 :Winter Lau

    好了Q一切正常,恭喜你的W一个?MINA 开发的|络E序已经成功q行了?/p>



    回页?/strong>


    MINA 基本cȝ描述

    在介l架构之前先认识几个接口Q?/p>

    IoAccepter 相当于网l应用程序中的服务器?/p>

    IoConnector 相当于客L

    IoSession 当前客户端到服务器端的一个连接实?/p>

    IoHandler 业务处理逻辑

    IoFilter qo器用于悬接通讯层接口与业务层接?/p>



    回页?/strong>


    MINA 的基架构

    下图?MINA 的架构图Q?/p>
    ?1QMINA 的架构图

    ? 图中的模块链中,IoService 便是应用E序的入口,相当于我们前面代码中?IoAccepterQIoAccepter 便是 IoService 的一个扩展接口。IoService 接口可以用来d多个 IoFilterQ这?IoFilter W合责Q链模式ƈ? IoProcessor U程负责调用。?IoAccepter ?ioService 接口的基上还提供l定某个通讯端口以及取消l定的接口。在上面的例子中Q我们是q样使用 IoAccepter 的:

    IoAcceptor acceptor = new SocketAcceptor();

    相当于我们用了 Socket 通讯方式作ؓ服务的接入,当前版本?MINA q提供了?SocketAccepter 外的Z数据报文通讯? DatagramAccepter 以及Z道通讯? VmPipeAccepter。另外还包括串口通讯接入方式Q目前基于串口通讯的接入方式已l在最新测试版?MINA 中提供。你也可以自行实? IoService 接口来用自q通讯方式?/p>

    而在上图中最右端也就? IoHandlerQ这便是业务处理模块。相当于前面例子中的 HelloHandler cR在业务处理cM不需要去兛_实际的通讯l节Q只处理客L传输q来的信息即可。编?Handler cd是?MINA 开发网l应用程序的重心所在,相当?MINA 已经帮你处理了所有的通讯斚w的细节问题。ؓ了简?Handler c,MINA 提供? IoHandlerAdapter c,此类仅仅是实C IoHandler 接口Q但q不做Q何处理?/p>

    一?IoHandler 接口中具有如下一些方法(摘自 MINA ?API 文档Q:

    void exceptionCaught(IoSession session, Throwable cause)
                       当接口中其他Ҏ抛出异常未被捕获时触发此Ҏ
    void messageReceived(IoSession session, Object message)
                       当接收到客户端的h信息后触发此Ҏ.
    void messageSent(IoSession session, Object message)
                       当信息已l传送给客户端后触发此方?
    void sessionClosed(IoSession session)
                       当连接被关闭时触发,例如客户端程序意外退出等{?
    void sessionCreated(IoSession session)
                       当一个新客户端连接后触发此方?
    void sessionIdle(IoSession session, IdleStatus status)
                       当连接空闲时触发此方?
    void sessionOpened(IoSession session)
                       当连接后打开时触发此ҎQ一般此Ҏ?sessionCreated 会被同时触发

    前面我们提到 IoService 是负责底层通讯接入Q?IoHandler 是负责业务处理的。那?MINA 架构图中?IoFilter 作何用途呢Q答案是你想作何用途都可以。但是有一个用途却是必ȝQ那是作ؓ IoService ?IoHandler 之间的桥梁。IoHandler 接口中最重要的一个方法是 messageReceivedQ这个方法的W二个参数是一?Object 型的消息QL周知QObject 是所?Java 对象的基Q那到底谁来军_q个消息到底是什么类型呢Q答案也在q个 IoFilter 中。在前面使用的例子中Q我们添加了一?IoFilter ?new ProtocolCodecFilter(new TextLineCodecFactory())Q这个过滤器的作用是来自客L输入的信息{换成一行行的文本后传递给 IoHandlerQ因此我们可以在 messageReceived 中直接将 msg 对象强制转换?String 对象?/p>

    ? 如果我们不提供Q何过滤器的话Q那么在 messageReceived Ҏ中的W二个参数类型就是一?byte 的缓冲区Q对应的cL org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放?IoHandler 中来做,但这q不是推荐的做法Q原来清晰的模型又模糊hQ变?IoHandler 不只是业务处理,q得充当协议解析的Q务?/p>

    MINA自n带有一些常用的qo器,例如LoggingFilterQ日志记录)、BlackListFilterQ黑名单qoQ、CompressionFilterQ压~)、SSLFilterQSSL加密Q等?/p>



    回页?/strong>


    其他

    MINA 不仅仅是用来开发网l服务器端应用程序,它一样可以?IoConnector 来连接到各种各样的网l服务程序?/p>

    ? q本文中 HelloServer q个例子Q我们在惊叹 MINA 可以带来多么大便利的同时Q还不得不ؓ其卓的性能而骄Ԍ据称使用MINA开发服务器E序的性能已经D使用 C/C++ 语言开发的|络服务。作? MINA 的入门文章,性能问题不在本文讨论范围内?/p>

    另外?MINA 压羃包中附带有不比 HelloServer 要好得多的例子,通过q些例子可以q一步的了解q掌?MINA?/p>

    参考资?

    http://mina.apache.org MINA 官方|站


    MINA 框架?/span>

    1。MINA 框架?/p>

    当客户首ơ访问采用MINA~写的程序时QIoAcceptor作ؓU程q行Q负责接受来自客Lh。当有客戯求连接时Q创Z? SessionQ该Session与IoProcessor、SocketChannel以及IOService联系h。IoProcessor也作? 另外一个线E运行,定时查客h否有数据到来Qƈ对客戯求进行处理,依次调用在IOService注册的各个IoFilterQ最后调? IoHandlerq行最l的逻辑处理Q再处理后的结果Filter后返回给客户端?/p>

    2。IoSession

    Session可以理解为服务器与客L的特定连接,该连接由服务器地址、端口以及客L地址、端口来军_。客L发vhӞ指定服务器地址和端口,客户端也会指定或者根据网l\׃息自动指定一个地址、自动分配一个端口。这个地址、端口对构成一个Session?/p>

    Session是服务器端对q种q接的抽象,MINA对其q行了封装,定义了IoSession接口Q用来代表客L与服务器的连接,在服务器端来 指代客户端,实现对客L的操作、绑定与客户端有关的信息与对象。通过利用Session的这个概念,~写E序时就可以在服务器端非常方便地区分出是当前 处理的是哪个客户端的h、维持客L的状态信息、可以实现客L之间怺通讯?/p>

    IoSession提供以下一些常用方法:

    Q?QsetAttribute(Object key, Object value)     getAttribute(Object key)

    讄/获取用户定义的属性?/p>

    该属性与session联系hQ方便以后处理用戯求时使用。比如如果要求用L录后才能l箋q行操作Q那么在用户成功登陆后,可以通过 setAttribute()讄一个属性,当用户以后l请求时Q可以通过getAttribute()获取该属性来判断用户是否d?/p>

    Q?QgetRemoteAddress()

    获取q程客户端地址?/p>

    Q?QgetId() getCreationTime()   getLastIoTime() getConfig()

    获取Session的Id、创建时间、上ơIO旉、配|信息?/p>

    Q?Qwrite(Object message)

    数据发送给客户端?/p>

    Q?Qclose()

    关闭Session?/p>

    说明Q可以在Session中发送数据,但是Session没有提供d数据的方法,d数据通过另一套机制在IoHandler的messageReceived()中实现?/p>

    3。Event

    MINA可以看成是事仉动的。通常在网l通讯中,可以整个过E划分ؓ几个基本的阶D,如徏立连接、数据通信、关闭连接?/p>

    数据通信一般包括数据的发送和接收Q由于在通信q程中,可能要多ơ发送和接收数据Q以q行不同的业务交互?/p>

    不可能一直都接收和发送数据,因此有Idle出现Q在MINA中,如果在设定的旉内没有数据发送或接收Q那么就会触发一个Idle事g?/p>

    ׃某种原因Q可能会发生错误Q导致系l异常发生,引发exception?/p>

    因此Q如果从事g发生的角度看的话Q就可以在MINA中将通信看成׃个徏立链接(sessionCreated ?sessionOpened Q、多个数据接收和发送、一个关闭连接事件以及多个Idle事g{?U事件组成的q程?/p>

    Session是对双方怺通信的抽象,因此通信的过E就是一pd与Session相关的事件?/p>

    在MINA现在对TCP的实CQsessionCreated ?sessionOpened 没有区别。因此严格来_?U类型的事g?/p>

    4。IoHandler

    从以上MINA框架囑֏以看出,Ҏ自客L数据最l处理是在IoHandler中处理的。IoHandler装了来自客L不同事g的处理, 如果Ҏ个事件感兴趣Q可以实现相应的ҎQ当该事件发生时QIoHandler中的Ҏ׃被触发执行。IoHandlerd?个方法对?个事 Ӟ

    Q?Qvoid exceptionCaught(IoSession session, Throwable cause)

    有异常发生时被触发?/p>

    Q?Qvoid messageReceived(IoSession session, Object message)

    有消息到达时被触发,message代表接收到的消息?/p>

    Q?Qvoid messageSent(IoSession session, Object message)

    发送消息时时被触发Q即在调用IoSession.write()时被触发Qmessage代表要发送的消息?/p>

    Q?Qvoid sessionClosed(IoSession session)

    当连接关闭时被触发,即Sessionl止时被触发?/p>

    Q?Qvoid sessionCreated(IoSession session)

    当创Z个新q接时被触发Q即当开始一个新的Session时被触发?/p>

    Q?Qvoid sessionIdle(IoSession session, IdleStatus status)

    当连接空闲时被触发。用IoSessionConfig中的setIdleTime(IdleStatus status, int idleTime)Ҏ可以讄session的空闲时间。如果该Session的空闲时间超q设|的|该方法被触发Q可以通过 session.getIdleCount(status)来获取sessionIdle被触发的ơ数?/p>

    Q?Qvoid sessionOpened(IoSession session)

    当打开一个连接时被触发。在目前的实CQ好?sessionOpened ?sessionCreated 没有太大区别QsessionCreated ?sessionOpened 之前被触发?/p>

    IoHandler是一个接口,一般情冉|有必要直接实现该接口的每一个方法。MINA提供了一个IoHandlerAdapterc,该类实现? IoHandler要求的方法,但是都没有做M处理。当我们要编写自qHandlerӞ可以扩展IoHandlerAdapterQ重写我们关心的 事gҎ卛_。比如,一般情况,我们比较兛_是否接收到数据这个时_那么我们可以覆盖messageReceivedҎQ不用管其他Ҏ?/p>

    5。IoFilter

    IoFilter用来对客Lh或发送给客户的数据进行filter。与IoHandler一PFilter也是Z事g的,通过实现IoFilter接口Q就可以寚w信q程中的Session的事件进行处理?/p>

    Filter是一U链式结构,与IoHandler不同Q处理每一USession事g的函CQ除了传入session对象外,q传入了 NextFilter对象Q用来代表下一个Filter。一般情况,在处理结束后Q调用下一个filter的相应方法作q一步处理。Filter也可以针 对特定的通信或数据,不进行进一步处理,可以不用调用NextFilter的相应方法?/p>

    除了与Session相应?U事件外Q在IoFilter中还可以对Filter的init、destroy以及add、remove{时间爱女作出处理?/p>

    MINA提供了一个IoFilterAdapterc,我们要编写自qFilterӞ可以扩展IoFilterAdapterQ不用直接实现IoFilter接口?/p>

    Apache MINA提供一个LoggingFilterc,用来log通信q程?/p>

    goto 2008-09-25 15:23 发表评论
    ]]>
    JAVA SOCKETpdQ三Q?/title><link>http://www.aygfsteel.com/mlxlzc/articles/229953.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 19 Sep 2008 07:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlxlzc/articles/229953.html</guid><wfw:comment>http://www.aygfsteel.com/mlxlzc/comments/229953.html</wfw:comment><comments>http://www.aygfsteel.com/mlxlzc/articles/229953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlxlzc/comments/commentRss/229953.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlxlzc/services/trackbacks/229953.html</trackback:ping><description><![CDATA[U程l式?br />     每客户一U程的模式增加了服务端的负荷Q那么我们可以简单的重用服务端处理线E?br />     服务端重用一定的U程来处理客LhQ客Lh被放|到一个池中供q发U程取出处理<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> com.lei.socket.test;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStreamReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.OutputStreamWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.ServerSocket;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.Socket;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.ArrayList;<br /> <br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> PooledClientServer {<br /> <br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">启动服务端监?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> start(){<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             setUpHandlers();<br />             ServerSocket server </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ServerSocket(port);<br />             Socket client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />             </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(runFlag){<br />                 client </span><span style="color: #000000;">=</span><span style="color: #000000;"> server.accept();<br />                 System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">accept client </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> client.getInetAddress().getHostAddress());<br />                 ClientHandle.handleClient(client);<br />             }<br />             server.close();<br />         }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">start error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />     }<br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">创徏处理U程l?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setUpHandlers() {<br />         </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> threadNum; i</span><span style="color: #000000;">++</span><span style="color: #000000;">) {<br />             ClientHandle ch </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ClientHandle();<br />             </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(ch, </span><span style="color: #000000;">"</span><span style="color: #000000;">Handler </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> i).start();<br />         }<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args){<br />         PooledClientServer s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> PooledClientServer();<br />         s.start();<br />     }<br />     <br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> port </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">3000</span><span style="color: #000000;">;<br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">q发处理U程?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> threadNum </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">;<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> runFlag </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /> }<br /> <br /> <br /> <br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">处理c?/span><span style="color: #008000;"><br /> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ClientHandle </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> Runnable{<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handleClient(Socket client) {<br />         </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> (pool) {<br />             pool.add(client);<br />             pool.notifyAll();<br />         }<br />     }<br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">处理客户?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handleClient(){<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             BufferedReader inReader </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedReader(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InputStreamReader(client.getInputStream()));<br />             BufferedWriter outWriter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedWriter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> OutputStreamWriter(client.getOutputStream()));<br />             </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />                 outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">please input String-></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                 outWriter.flush();<br />                 String str </span><span style="color: #000000;">=</span><span style="color: #000000;"> inReader.readLine();<br />                 </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str.equalsIgnoreCase(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit</span><span style="color: #000000;">"</span><span style="color: #000000;">)){<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit ok</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     client.close();<br />                     </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />                 }<br />                 </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">reulst is :</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuffer(str).reverse().toString());<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">\r\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                 }<br />             }<br />         }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Handle client error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){<br />         </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) {<br />             </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> (pool) {<br />                 </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (pool.isEmpty()) {<br />                     </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                         pool.wait();<br />                     } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) {<br />                         e.printStackTrace();<br />                         </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />                     }<br />                 }<br />                 client </span><span style="color: #000000;">=</span><span style="color: #000000;"> (Socket) pool.remove(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />             }<br />             handleClient();<br />         }<br />     }<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Socket client;<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> ArrayList pool </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ArrayList();<br /> }<br /> </span></div> <br /> <br /> <img src ="http://www.aygfsteel.com/mlxlzc/aggbug/229953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlxlzc/" target="_blank">goto</a> 2008-09-19 15:35 <a href="http://www.aygfsteel.com/mlxlzc/articles/229953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA SOCKETpdQ二Q?/title><link>http://www.aygfsteel.com/mlxlzc/articles/229933.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 19 Sep 2008 06:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlxlzc/articles/229933.html</guid><wfw:comment>http://www.aygfsteel.com/mlxlzc/comments/229933.html</wfw:comment><comments>http://www.aygfsteel.com/mlxlzc/articles/229933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlxlzc/comments/commentRss/229933.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlxlzc/services/trackbacks/229933.html</trackback:ping><description><![CDATA[多线E式Q?br /> 在实际用过E中我们都会希望服务端能同时为多个客L提供服务<br /> 最直接的办法就是每个客L一个线E?br /> q种方式会在一定意义上占用更多pȝ资源<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> com.lei.socket.test;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStreamReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.OutputStreamWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.ServerSocket;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.Socket;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MultiThreadServer {<br /> <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">启动服务端监?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> start(){<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             ServerSocket server </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ServerSocket(port);<br />             Socket client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />             </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(runFlag){<br />                 client </span><span style="color: #000000;">=</span><span style="color: #000000;"> server.accept();<br />                 System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">accept client </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> client.getInetAddress().getHostAddress());<br />                 </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ClientHandle(client)).start();<br />             }<br />             server.close();<br />         }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">start error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args){<br />         MultiThreadServer s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MultiThreadServer();<br />         s.start();<br />     }<br />     <br />     </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> ClientHandle </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> Runnable{<br />         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> ClientHandle(Socket s){<br />             </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.client </span><span style="color: #000000;">=</span><span style="color: #000000;"> s;<br />         }<br />         <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;">处理客户端请?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handleClient(){<br />             </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />                 BufferedReader inReader </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedReader(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InputStreamReader(client.getInputStream()));<br />                 BufferedWriter outWriter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedWriter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> OutputStreamWriter(client.getOutputStream()));<br />                 </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">please input String-></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     outWriter.flush();<br />                     String str </span><span style="color: #000000;">=</span><span style="color: #000000;"> inReader.readLine();<br />                     </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str.equalsIgnoreCase(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit</span><span style="color: #000000;">"</span><span style="color: #000000;">)){<br />                         outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit ok</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                         client.close();<br />                         </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />                     }<br />                     </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />                         outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">reulst is :</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuffer(str).reverse().toString());<br />                         outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">\r\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     }<br />                 }<br />             }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />                 System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Handle client error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />             }<br />         }<br />         <br />         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run(){<br />             handleClient();<br />         }<br />         <br />         </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Socket client;<br />     }<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> port </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">3000</span><span style="color: #000000;">;<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> runFlag </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /> }<br /> <br /> <br /> <br /> </span></div> <br /> <br /> <img src ="http://www.aygfsteel.com/mlxlzc/aggbug/229933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlxlzc/" target="_blank">goto</a> 2008-09-19 14:33 <a href="http://www.aygfsteel.com/mlxlzc/articles/229933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA SOCKETpdQ一Q?/title><link>http://www.aygfsteel.com/mlxlzc/articles/229925.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 19 Sep 2008 06:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/mlxlzc/articles/229925.html</guid><wfw:comment>http://www.aygfsteel.com/mlxlzc/comments/229925.html</wfw:comment><comments>http://www.aygfsteel.com/mlxlzc/articles/229925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mlxlzc/comments/commentRss/229925.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mlxlzc/services/trackbacks/229925.html</trackback:ping><description><![CDATA[客户端输入一串字W串  服务端反序输?quit退出来学习java socket~程?br /> 1Q阻塞模?<br />    一ơ只能ؓ一个客L服务Q这U用在实际使用q程中基本没有用?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> com.lei.socket.test;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.BufferedWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.IOException;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStreamReader;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.OutputStreamWriter;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.ServerSocket;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.Socket;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SimpleServer {<br />     <br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">启动服务端监?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> start(){<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             ServerSocket server </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ServerSocket(port);<br />             Socket client </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />             </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(runFlag){<br />                 client </span><span style="color: #000000;">=</span><span style="color: #000000;"> server.accept();</span><span style="color: #008000;">//</span><span style="color: #008000;">d</span><br /> <span style="color: #000000;">                System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">accept client </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> client.getInetAddress().getHostAddress());<br />                 handleClient(client);<br />             }<br />             server.close();<br />         }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">start error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />     }<br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">处理客户端请?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> handleClient(Socket client){<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             BufferedReader inReader </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedReader(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InputStreamReader(client.getInputStream()));<br />             BufferedWriter outWriter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedWriter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> OutputStreamWriter(client.getOutputStream()));<br />             </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br />                 outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">please input String-></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                 outWriter.flush();<br />                 String str </span><span style="color: #000000;">=</span><span style="color: #000000;"> inReader.readLine();<br />                 </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(str.equalsIgnoreCase(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit</span><span style="color: #000000;">"</span><span style="color: #000000;">)){<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">quit ok</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     client.close();<br />                     </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />                 }<br />                 </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">reulst is :</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuffer(str).reverse().toString());<br />                     outWriter.write(</span><span style="color: #000000;">"</span><span style="color: #000000;">\r\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                 }<br />             }<br />         }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Handle client error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args){<br />         SimpleServer s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SimpleServer();<br />         s.start();<br />     }<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> port </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">3000</span><span style="color: #000000;">;<br />     <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> runFlag </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /> }<br /> </span></div> <br /> <br /> <img src ="http://www.aygfsteel.com/mlxlzc/aggbug/229925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mlxlzc/" target="_blank">goto</a> 2008-09-19 14:02 <a href="http://www.aygfsteel.com/mlxlzc/articles/229925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNIX 下socket~程例子http://www.aygfsteel.com/mlxlzc/articles/229613.htmlgotogotoThu, 18 Sep 2008 03:10:00 GMThttp://www.aygfsteel.com/mlxlzc/articles/229613.htmlhttp://www.aygfsteel.com/mlxlzc/comments/229613.htmlhttp://www.aygfsteel.com/mlxlzc/articles/229613.html#Feedback0http://www.aygfsteel.com/mlxlzc/comments/commentRss/229613.htmlhttp://www.aygfsteel.com/mlxlzc/services/trackbacks/229613.html
      #include   <sys/types.h>  
      #include   
    <sys/socket.h>  
      #include   
    <arpa/inet.h>  
      #include   
    <netinet/in.h>  
      #include   
    <sys/param.h>  
      #include   
    <sys/types.h>  
      #include   
    <errno.h>  
      #include   
    <sys/stat.h>  
      #include   
    <stdio.h>  
      #include   
    <stdlib.h>  
      #include   
    <unistd.h>  
      #include   
    <stropts.h>  
      #include   
    <string.h>  
      #include   
    <pthread.h>  
      #include   
    <strings.h> 
      #include   
    <signal.h> 
       
      
    #define   SERV_PORT   1685 
      
    #define   STRINGLEN   255  
      
    #define   DATALENGTH   1024  
      
    #define IP "172.18.215.24"
       
       
    void alarm_timeout();
      
    /*数据的传输结?/span>*/  
      
    struct DataInfo  
      {  
          
    char   chRemotePath[STRINGLEN];  
          
    char   chFileName[STRINGLEN];  
          
    int    iFileLen;  
          
    int    iDataLen;  
          
    char   chData[DATALENGTH];  
      };  
      typedef 
    struct DataInfo S_DataInfo;
       
      
    int   main(int   argc,   char   **argv)  
      {  
          
    int   iSockfd,   iNewSockfd;  
          
    int remote_len;
          
    char  remote_ip[64];  
          
    struct   sockaddr_in   MyAddr;    
          
    struct   sockaddr_in   TheirAddr;   
          
    struct sockaddr_in cli_addr = {AF_INET}; 
          
    int   iSinSize;  
          S_DataInfo  data, 
    *buffer;   
          buffer   
    =   (S_DataInfo*)malloc(sizeof(S_DataInfo));  
           
          bzero(
    &MyAddr,   sizeof(MyAddr));  
          bzero(
    &data,   sizeof(data));  
           
          
    /*往data中填入测试数?/span>*/  
          
    //strcpy(data.chData,   "\"This   sentence   is   from   server.\"");  
          
    //data.iDataLen   =   strlen(data.chData);  
           
          
    if((iSockfd   =   socket(AF_INET,   SOCK_STREAM,   0))   ==   -1)  
          {  
              perror(
    "socket()");  
              exit(
    -1);    
          }  
          MyAddr.sin_family   
    =   AF_INET;  
          MyAddr.sin_port   
    =   htons(SERV_PORT);  
          MyAddr.sin_addr.s_addr   
    =   inet_addr(IP);  
          
    if(bind(iSockfd,   (struct   sockaddr_in   *)&MyAddr,   sizeof(struct   sockaddr_in))   ==   -1)  
          {  
              close(iSockfd);  
              perror(
    "bind()");    
              exit(
    -1);    
          }  
          
    if(listen(iSockfd,   10)   ==   -1)  
          {  
              close(iSockfd);  
              perror(
    "listen()");    
              exit(
    -1);  
          }  
          signal(SIGCLD,SIG_IGN);
          
    for(;;)  
          {    
          iSinSize   
    =   sizeof(struct   sockaddr_in);    
          printf(
    "Waiting\n");  
          
    if((iNewSockfd   =   accept(iSockfd,   (struct   sockaddr_in   *)&TheirAddr,   &iSinSize))   ==   -1)  
          {  
              close(iSockfd);  
              perror(
    "accept()");    
              exit(
    -1);    
          }  
          printf(
    "Server:   got   connection   from   %s\n",   inet_ntoa(TheirAddr.sin_addr));    
          
    int i = 0;
          
    switch(fork())  
          {  
              
    case   -1:  
                  close(iSockfd);  
                  close(iNewSockfd);  
                  perror(
    "fork()");  
                  exit(
    -1);  
              
    case   0:  
                  
                   
    //sleep(120); 
                   
    //printf("sleep ok\n");
                  while (i++ < 2)
                  { 
                      
    /*
                      
                       getpeername(iNewSockfd,(struct sockaddr *)&cli_addr,&remote_len);
                                     strcpy(remote_ip,(char *)inet_ntoa(cli_addr.sin_addr));
                                     printf("client ip is %s \n",remote_ip);
                                     signal( SIGALRM, alarm_timeout );
                                     alarm(200); 
                      if(read(iNewSockfd,   buffer,   sizeof(S_DataInfo))   <=   0)  
                      {  
                          close(iSockfd);  
                          close(iNewSockfd);  
                          printf("read data error !!");
                          exit(-1);  
                      }  
                      alarm(0);
                      printf("read data success ,datalen = %d,data =[%s]\n",buffer->iDataLen,buffer->chData); 
                      
    */
                      
    //sleep(10);
                      sleep(11);
                          strcpy(data.chData, 
    "server receive data "); 
                          strcat(data.chData, buffer
    ->chData);
                                data.iDataLen   
    =   strlen(data.chData);  
                       
                      
    if(write(iNewSockfd,   &data,   sizeof(S_DataInfo))   ==   -1)  
                      {  
                          close(iSockfd);  
                          close(iNewSockfd);  
                          perror(
    "write()");  
                          exit(
    -1);  
                      } 
                      
                      
    //if( (data.iDataLen == 4) && (strcmp(data.chData,"exit") == 0) )
                      
    //    break;
                  }
                   
                  printf(
    "send and receive is   complete.\n");   
                  close(iNewSockfd);  
                  exit(
    0);  
          
    default:  
                  
    /*父进E中处理*/  
                 close(iNewSockfd);
          }
    /*end   switch*/  
           
          }  
    /*end for(;;)*/
          free(buffer);
          
    return   0;  
      }   
      
      
    void alarm_timeout()
    {
        printf(
    "alarm_timeout ok\n");
        exit(
    0);
        
    }
     

    client.c
      #include   <stdio.h>  
      #include   
    <string.h>  
      #include   
    <errno.h>  
      #include   
    <sys/types.h>  
      #include   
    <sys/socket.h>  
      #include   
    <netinet/in.h>  
      #include   
    <arpa/inet.h>  
       
      
    #define   SERV_PORT   1685 
      
    #define   STRINGLEN   255  
      
    #define   DATALENGTH   1024  
      
    #define IP "172.16.215.149"   
       
       
    /*数据的传输结?/span>*/  
      
    struct DataInfo  
      {  
          
    char   chRemotePath[STRINGLEN];  
          
    char   chFileName[STRINGLEN];  
          
    int    iFileLen;  
          
    int    iDataLen;  
          
    char   chData[DATALENGTH];  
      };  
      typedef 
    struct DataInfo S_DataInfo;
      
      
    int   main()  
      {  
          
    int   sock;  
          
    struct   sockaddr_in   sin;  
          S_DataInfo  data, 
    *buffer;   
          buffer   
    =   (S_DataInfo*)malloc(sizeof(S_DataInfo));  
           
          bzero(
    &data,   sizeof(data));  
           
          sock   
    =   socket(AF_INET,   SOCK_STREAM,   0);  
          
    if   (sock   ==   -1)  
          {  
              perror(
    "client   socket");  
              
    return   -1;  
          }  
           
          memset(
    &sin,   0,   sizeof(sin));  
          sin.sin_family   
    =   AF_INET;  
          sin.sin_addr.s_addr   
    =   inet_addr(IP);  
          sin.sin_port   
    =   htons(SERV_PORT);  
           
          
    if   (connect(sock,   (struct   sockaddr   *)&sin,   sizeof(sin))   ==   -1)  
          {  
              perror(
    "client   connect   error");  
              
    return   -1;  
          }  
          
    int i = 0;
          
    //sleep(120);
          printf("sleep ok\n");  
          
    while (i++ < 10)
          {
              data.iDataLen 
    = 1;
              data.chData[
    0= i + 48;
              
              
    //send
              if(write(sock,    &data,   sizeof(S_DataInfo))   <= 0){
                         printf(
    "send data %d error\n",i);  
                         
    return   -1;  
                }
                printf(
    "send data [%s] ok\n",data.chData);
               
                
    //receive
                /*
                   if (read(sock,  buffer,   sizeof(S_DataInfo)) <= 0){
                         printf("revdata %d error",i);  
                         return   -1;  
                }
                printf("receive data [%s] ok\n",buffer->chData);
                
    */
              
          }  
           
          close(sock);  
      }   
     




    goto 2008-09-18 11:10 发表评论
    ]]>
    վ֩ģ壺 | | ɳ| ƽ| | Ǩ| | | | ͨ| | | | | ¡| ʡ| | | | | ˫| | | | Ϣ| | ʱ| | | | | ֶ| | Դ| | | α| ͭϿ| ʻ| | ߱|