初始网络进程通信

系统 1725 0

可以这样说:我们在网络上只做一件事,利用各种软件没完没了的相互通信。

       对于单机系统而言,进程在系统中有自己唯一的进程号。 但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。而且   操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。

      为此,TCP/IP协议为网间进程通信问题建立了IP地址,端口,Socket(套接字)等概念。

     (1) IP地址

           IP地址是连入网络中的机器的唯一识别地址。信息可以根据IP选择路由方向,从而找到目的地机器。这就像   邮递员(路由器)根据你们家房子(目的机器)的地址(IP地址)递送包裹(信息)  

 

     (2) 端口

           我们知道,一台拥有IP地址的主机可以提供许多服 务,比如web服务、FTP服务、SMTP服务等。对于不同的服务请求,主机需要调用不同的程序进行处理。可是主机怎么知道是什么服务请求那?显然仅仅知道IP地址是不够的,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。

          端口实质上是抽象的软件结构(不要理解成机器上的USB插槽),它包括一些数据结构和I/O(基本输入输出)缓冲区。系统会为这些数据结构和缓冲区指定一个唯一的端口号。不同的端口号对应提供不同服务的程序。比如80号端口是HTTP端口,当要申请主机的HTTP服务时,我们将申请信息发送到指定IP的80号端口的数据结构内。这时主机会监听到80号端口有服务请求,自动调用HTTP服务进程进行服务。

            如果说IP地址是你家房子的地址,那么端口就是你家的门(这个房子确实门多了点)。不同的访客走不同的门,行贿的家伙一定要走后门(不排除小偷翻窗户的可能)   当你听到后门有人敲门的时候,嘿嘿......

 

      (3) Socket 套接字

       有的时候,多个应用程序可能同时需要向同一个接口发送数据       。为了区别不同的应用程序进程和连接   ,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。

        区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意 是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

      Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动 建立关系。此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定IP地址和端 口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的 发送与接收的。  
 

                初始网络进程通信

        了解了基于TCP/IP协议的网间进程通信的部分概念之后,现在我想写一个Java版的C-S通信程序。既然应用程序需要通过"套接字"向网络发出请求或者应答网络请求。我们自然要为客户端和服务器端的程序创建自己的Socket。

       还好,JDK中就有我们想要的东西——Socket和ServerSocket类。简单介绍一下这两个类:

      Socket类用于客户端,为建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

      ServerSocket类用于服务器端,他可以创建绑定到特定端口的服务器套接字。当监听到端口内容时,他将创建一个用于链接的Socket对象。

      对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是 ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

 

Java代码     收藏代码
  1. //客户端程序,用于向服务器端发送一句“hello server!”   
  2. import  java.net.*;  
  3. import  java.io.*;  
  4. public   class  Client{  
  5.      private  String ipTo= "172.16.129.13" ; //服务器端IP地址   
  6.      private   int  port= 8189 ; //需要通过的服务器端口号   
  7.       
  8.      public   void  hello(){  
  9.          try {  
  10.                         //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。    
  11.             Socket clientSocket= new  Socket(ipTo,port);  
  12.              try {  
  13.                 System.out.println( "success connection...." );  
  14.                                  //返回此套接字的输出流   
  15.                 OutputStream os=clientSocket.getOutputStream();  
  16.                 PrintWriter pw= new  PrintWriter(os, true );  
  17.                     pw.println( "hello server!" );  
  18.             }  
  19.              finally {  
  20.                 clientSocket.close();  
  21.             }  
  22.         } catch (IOException e){  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26.   
  27.      public   static   void  main(String[] args)  
  28.     {  
  29.         Client client= new  Client();  
  30.         client.hello();  
  31.     }  
  32. }  
Java代码     收藏代码
  1. //服务器端程序,用于接受客户端的信息   
  2. import  java.net.*;  
  3. import  java.io.*;  
  4. public   class  Server{  
  5.      private   int  lisenerPort= 8189 ; //监听端口   
  6.   
  7.      private   void  lisener(){  
  8.          try {  
  9.                        //创建服务器端套接字,用于绑定指定端口   
  10.             ServerSocket serverSocket= new  ServerSocket(lisenerPort);  
  11.                        //监听绑定的端口,用于产生阻塞,直到接受到一个来自客户端的有效连接,并且返回一个客户端的Socket对象实例。   
  12.             Socket socket=serverSocket.accept();  
  13.              try {  
  14.                                  //创建套接字输入流   
  15.                 InputStream is=socket.getInputStream();  
  16.                 BufferedReader br= new  BufferedReader( new  InputStreamReader(is));  
  17.                                  //服务器端显示来自客户端的问候   
  18.                 System.out.println(br.readLine());  
  19.             }  
  20.              finally {  
  21.                 serverSocket.close();  
  22.             }  
  23.         } catch (IOException e)  
  24.         {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.      public   static   void  main(String[] args)  
  29.     {  
  30.         Server server= new  Server();  
  31.         server.lisener();  
  32.     }  
  33.   
  34. }  
 

初始网络进程通信


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论