客户端和服务器之间通信讲解

原文网址:http://www.myexception.cn/program/1600316.html

一、关键词解释

  客户端:能向服务器发送信息,提出请求。

  服务器能接收客户端发来的请求,并能发送数据给客户端以做出回应。

从这里可以看出,我们的电脑可以充当双重角色。

1、当我们用浏览器浏览网页,要查看某个文件时,我们的电脑会发出请求给文件服务器,文件服务器收到请求并同意后,将文件数据传送到我们的电脑。此时,电脑充当客户端的角色。

2、当电脑和打印机通信后,打印机发送打印请求,此时我们可以令电脑发出打印信息(打印内容,单/双页打印等等)给打印机,打印机就可以开始打印了。此时电脑充当服务器的角色。

 

二、疑问及其理解

    客户端与服务器是怎样进行通信的?

以上面的电脑例子来说的话。

1、通信首先需要进行通信的实体

  电脑&&文件服务器(可能是台功能强大的电脑),电脑&&打印机。

2、然后是通信的媒介

  如上面例子中用到的电缆或光缆,当然也可能是介于某一频谱范围内的看不见的无线电波。

3、最关键的是通信协议

  电脑要和打印机交流,必须要规定通信的规矩,即协议(电脑发送一段数据过去,也许就是一个符号'Y',但打印机需要明白这是要打印的意思,所以他们事先要规定好什么是什么的意思,才不会出现对牛弹琴的现象)。当然,协议可多了,远不止于这一点。信息从电脑发出到文件服务器,就进过了许多的协议。本来是一段文字,经过某种协议被转化成能在媒介中传递的电信号或电磁波等信号,这些信号要达到文件服务器那一端,中途可能会碰到一系列的节点(能接受信息并做出处理的系统,如路由器),节点会按照某种协议告诉这些信号该怎样走才能到达文件服务器,然后信号开始沿着该节点告诉他的方向继续传递(要知道互联网的线路可是比蜘蛛网复杂的多,没有中间一系列节点的帮助,要达到目的地可不容易啊!)。最好要到达目的地时,要按照协议将电信号或电磁波信号转换为文件服务器能识别的信息。意思大概就是这样,如果想知道具体什么协议的话,就需要查看相关文献了,重中之重莫过于TCP/IP协议了。

 

三、用socket套接字实现应用程序间的通信

1、应用程序作为服务器时,可以用以下代码实现:

   ServerSocket server=new ServerSocket(int Port);

//server是创建的服务器对象,Port为该服务器占用的端口号,只有当服务器和客户端的端口号相同时才能连接成功。

     在服务器端进行等待:

         Socket socket2=server.accept();//服务器等待客户机的访问,程序运行到此处将被堵塞,即不向下继续执行,直到有客户机访问该服务器

2、应用程序作为客户端时,可以用如下代码来创建将与端口号一致的服务器相连的客户端:

   Socket client=new Socket(String IP,int Port);

  //client是创建的客户端对象,IP、Port分别是该客户端占用的IP号、端口号,此时服务器的socket2被声明成功,堵塞状态不复存在,程序继续向下执行

3、客户端和服务器连上后,需要进行他们之间的通信,怎么办呢?可以分别获取两个对象的输入、输出流对象,以进行读写操作。

    获取客户端的输入、输出流对象:

   InputStream is_client=socket.getInputStream();

    //is_client是客户端socket的输入流对象

   OutputStream os_client=socket.getOutputStream();

    //os_client是客户端socket的输入流对象

  同样的,可以获取服务器端的输入、输出流对象:

 InputStream is_server=socket2.getInputStream();

    //is_server是客户端socket的输入流对象

   OutputStream os_server=socket2.getOutputStream();

    //os_server是客户端socket的输入流对象

 

4、有了输入、输出流对象后,可以用读写操作进行服务器和客户端之间的通信了。

a、客户端写入信息,服务器获取信息:

      is_client.write("hello#".getBytes());//客户端写入"hello”,'#'是信息结束的协议

      StringBuffer sb=new StringBuffer();//sb是长度可动态变化的字符串对象,便于添加字符和字符串,用来保存下面服务器读到的信息

       char c;//用于保存读到的单个字节

       c=os_server.read();//将读到的一个字节存储到变量c中

      while(c!='#'){//当读到的字符不是表示信息结束的'#'时,就一直读取下去

              sb.append(c);//将读到的字符添加到sb中

              c=os_server.read();//继续读取下一个字节

       }

      接下来,服务器就可以对保存在sb中的信息进行相应的处理

b、同理,服务器回应客户端的过程,也就是服务器写入信息(os_server.write()),客户端读取信息(is_client.read())的,只是将上面的输入、输出流对象变换一下

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值