`

2.一步一步实现简单服务器

阅读更多

   在这一段,我们的目地是创建一个简单服务器,能将客户机发来的字符串显示出来,并且再回送给客户机——有必要解释一下:在这里,服务器指的是等待别人来连接的机器;客户机,当然就指的是主动去连接别人的机器了,这就像打电话过程中的主叫与被叫的区分一样,一旦连结成功,就不存在这样谁是客户机谁是服务器的区分了。

Java中编写网络通信程序,必须用到java.net包下面的API。创建一个服务器,相当简单。

 

第一步:在指定端口上创建一个java.net.ServerSocket对象,如下代码:

   ServerSocket server=new ServerSocket(9090);

    System.out.println("服务器创建成功!"+port);

 

第二步:服务器创建成功后,就像手机开机后,进入待机状态一样,你也要让服务器进入等待状态,当然是等待其他的客户机来连接:

//在等待客户机连接进入,进入后,生成一个Socket对象

    java.net.Socket client=server.accept();

      System.out.println("Incoming "+client.getRemoteSocketAddress());

注意:调用服务器对象server.accept()方法时,程序就会“阻塞在这个调用上,或者说“卡”到这里——直到有一个客户机连接上来,这个方法才会返回,返回一个Socket类对象——这个对象就代表了服务器与客户机之间的连接。可以这样理解:当你拔通我的手机时,可以理解为我的机手机中存在着一个“通话对象”,就相当于此的client对象;以后(服务器)与客户机的通信,就在这个Socket类型的对象client上进行。

 

第三步:Socket连接对象上调用方法得到输入输出流:

java.net.Socket client=server.accept();

             //从连接对象上得到输入流和输出流对象

      OutputStream out=client.getOutputStream();

InputStream ins=client.getInputStream();

   如果这段代码难以理解,请看下图1.10所示和解说。


 

 

1.10 网络通信连接示意图

 

         图1.10所示网络通信过程如下:当你在指定端口创建了一个ServerSocket对象后,就相当于你买了一部手机,且申请到了一个手机号,但此时还不能通话——除排你开机进入待机状态,就如同程序中调用Server对象的accept()方法等待客户机连接进入;当客户机连接进入后,在服务器程序中,即得到一个代表它们之间通话通道的连接对象Socket

      最后从这个Socket上得到输入、输出流对象:当一个电话接入后,你手机中的喇叭就相当于此的输出流对象,输入流对象自然的对应于手机中的话筒。你向输入流中写入的数据,就被发向了客户机,如果你从输出流对象中读取数据,读到的就是客户机发来的数据

 

第四步:你使用输入/输出流对象进行通信数据的读写:从输入流中读取数据,向输出流中写入数据。读到的数据,即是客户机发来的数据;写出的数据,就会发送给客户机!发送的代码如下所示:

 

String s="你好,欢迎来javaKe.com\r\n";

      //取得组成这个字符串的字节

       byte[] data=s.getBytes();

       //用输出对象发送!

          out.write(data);

          out.flush();//强制输出

       //半闭与客户机的连接

client.close();

 

第五步:最后,将如上步骤完整地集成起来,得到如下代码所示:

 

/**

 * 简单服务器实现

 * @author www.NetJava.cn

 */

public class ChatServer {

    /**

     * 在指定端口上启动一个服务器

     * @param port:服务器所以的端口

     */

    public void setUpServer(int port){

       try{

     //建立绑定在指定端口上的服务器对象

     ServerSocket server=new  ServerSocket(port);

    System.out.println("服务器创建成功!"+port);

      //让服务器进入等待状态:阻塞状态

      Socket client=server.accept();

     //从连接对象上得到输入输出流对象

      OutputStream out=client.getOutputStream();

      InputStream ins=client.getInputStream();

      String s="你好,欢迎来javaKe.com\r\n";

        byte[] data=s.getBytes();//取得组成这个字符串的字节

           out.write(data); //用输出对象发送数据!

          out.flush();//强制输出

          client.close();//半闭与客户机的连接

       }catch(Exception ef){

           ef.printStackTrace();

       }

    }

    //主函数

    public static void main(String[] args) {

       ChatServer cs=new ChatServer();

       cs.setUpServer(9090);

    }

}

     

        如果以上程序运行成功,你可能会有疑问?客户机在哪里呢?我是怎么做为一个客户机连接上这段代码所实现的服务器打开的9090端口呢?这个简单,还记得上一节所述的telnet吗?物理上,一台计算机,可以在逻辑中的分成客户机和服务器两部分。现在你手前的计算机就是一台服务器,当你进入命令行,执行telnet命令后,它同时又是一台客户机。这样,本地的IP地址可以用”localhost”这个词指代,当然不包括双引号。如图1.11所示,使telnet客户端连接你开发的服务器程序。

1.11 使用telnet命令连接自已的服务器

 

回车后,你的telnet客户端应接收并显示服务器发送来的消息。如图1.12所示。
 

1.12 telnet客户端接收到服务器发来的消息

 

      当然,你也可以在局域网中其他电脑的命令行中输入“telnet 你的ip 端口”命令,测试接收服务器输出的消息。

 

以上步骤中,如果运行服务器出错,可能会在控制台看到报错信息:

 

java.net.BindException: Address already in use: JVM_Bind

    at java.net.PlainSocketImpl.socketBind(Native Method)

    at java.net.PlainSocketImpl.bind(Unknown Source)

    at java.net.ServerSocket.bind(Unknown Source)

    at java.net.ServerSocket.<init>(Unknown Source)

    at java.net.ServerSocket.<init>(Unknown Source)

    at cn.netjava.chatv2.ChatServer.setUpServer(ChatServer.java:20)

    at cn.netjava.chatv2.ChatServer.main(ChatServer.java:42)

     该引起报错的原因,是设定给服务器的端口已经被其他程序占用了。换一个端口号试试?当然,不要以为端口号是个int型数值就可以,不能小于零或大于65535啦!

 

     如果一切正常,最后,你还是发现了一个极大的缺陷:一个客户机连接上来后,收到服务器发出的一条消息,服务器程序就退出了。如此不稳定,怎担当服务器角色?想要解决这个问题,请进入下一节。

  • 大小: 55.9 KB
  • 大小: 2.5 KB
  • 大小: 3.5 KB
5
1
分享到:
评论
3 楼 di1984HIT 2016-05-10  
学习了 
2 楼 何枫abc 2011-01-24  
谢谢大哥的分享与奉献.我是刚刚参加工作的.工作工作这边主要也是电信方面的业务,有了大哥的无私奉献与经验总结.那我的学习就可以事半功倍了.在此由衷的感谢.
1 楼 xchao 2010-10-25  

看来大家都是大牛,不稀罕这样基础的知识,没有一个人回复!

网络编程,清晰,明了!

谢谢分享!

相关推荐

    配置路由访问服务器.pptx

    13.1 选择路由访问方法(2) 示例配置一台Windows 2000路由服务器连接两个子网(安装两个网络适配器) A:210.43.16.0/255.255.255.0 B:210.43.19.0/255.255.255.0 配置路由访问服务器全文共41页,当前为第4页。...

    客户服务器程序设计及实现.doc

    4)题目:简单的客户/服务器程序设计与实现 实验目的及要求: 1、熟悉Microsoft Visual Studio 2008编程环境。 2、了解TCP与UDP协议,以及它们之间的区别。 3、了解客户/服务器模型原理。 4、熟悉Socket编程原理,...

    WEB服务器设计.doc

    2.Zeus Webserver3.3.8 服务器,Zeus服务器在SMP (Symmetric Multi Processing的简称,意为对称多处理系统,内有许多紧耦合多处理器,这种系统的最大 特点就是共享所有资源) 环境下有优秀的可伸缩性,并实现了常见...

    IIS2.INF-IIS2.DLL-IIS.INF-IIS.DLL.-windowns xp sp3 IIS5.1完整安装包IISXPSP3.rar

    但做到这一步还不算完,因为是安装包安装的,需要对IIS进行一些设置(不然会出现内部服务器500错误)。 2、解决数据库链接错误的方法 打开开始--所有程序--管理工具--组件服务,在左边选择“控制台根目录”-&gt;"组件...

    DHCP服务器配置的实验报告.doc

    在使用DHCP时,整个网络至少有一台服务器上安装了DHCP服务,其他要使用DHCP功能的 工作站也必须设置成利用DHCP获得IP地址 DHCP 的实现机理 DHCP使用客户/服务器模式,在系统启动时,DHCP 客户机在本地子网中先发送 ...

    华盾服务器管理专家 3.0.3.78.rar

    华盾服务器管理专家是一款服务器日常维护管理软件,集华盾独创的“WEB一站式管理”、用户权限管理、信息管理管理、性能管理管理、网站安全管理、主机维护管理、网站备案管理、网站维护管理、网络防火墙管理、系统...

    游戏服务器gameserver.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    C++使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!...

    rf2游戏服务器状态HTTP查询插件rf2-status-server.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    一个mmo游戏服务器SimpleServer.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    分布式游戏服务器引擎yjengine.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    Linux C 轻量级游戏服务器GameServer.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    轻量级跨平台游戏服务器GameServer.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。拒绝访问解决方法

    症状:Ping命令可以通过,但无法在“网上邻居”中实现互访。 解决:在WIN2000/XP系统中:控制面板 -&gt; 管理工具 -&gt; 计算机管理 -&gt; 本地用户和组 -&gt; 用户,在Guest帐户上点击鼠标右键,选择属性,在常规项里取消...

    游戏服务器定时器server_timer.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家猜一个1到100之间的随机生成的数字。以下是对这个小游戏的分析: Random 类的使用:游戏开始时,使用 Random 类生成一个1到100之间的随机数作为要猜的数字。 ...

    java开源包2

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    Python Web程序搭建简单的Web服务器

    上一篇讲了《Python入门》Windows 7下Python Web开发环境搭建笔记,接下来讲一下Python语言Web服务的具体实现:第一个Python Web程序——简单的Web服务器。 与其它Web后端语言不同,Python语言需要自己编写Web服务器...

    java开源包3

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    智能库房管理系统-智能库房管理软件.doc

    每一步智能库房管理系统,智能库房管理软件都为您提 供详尽准确的数据。智能库房管理系统,智能库房管理软件有效辅助企业解决业务管理 、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题...

    java开源包4

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics