zoukankan      html  css  js  c++  java
  • 【Android笔记】ServerSocket 与 Socket的区别

    1 ServerSocket类
        
    创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:
        ServerSocket MyListener=new ServerSocket(600);
        这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同的端口号上提供不同的服务。为了随时监听可能的Client请求,执行如下的语句:
        Socket LinkSocket=MyListener.accept();
        该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。结束监听时,关闭ServerSocket对象:
        Mylistener.close();
    2 Socket类
        当Client程序需要从Server端获取信息及其他服务时,应创建一个Socket对象:
        Socket MySocket=new Socket(“ServerComputerName”,600);
        Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。
        Socket对象建立成功之后,就可以在Client和Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的方法getOutputStream()和getInputStream()分别获得向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新返还到Server端。
        当Server和Client端的通信结束时,可以调用Socket类的close()方法关闭Socket,拆除连接。

    ServerSocket 一般仅用于设置端口号和监听,真正进行通信的是服务器端的Socket与客户端的Socket,在ServerSocket 进行accept之后,就将主动权转让了。

    1. 服务器端程序设计
        在服务器端,利用ServerSocket类的构造函数ServerSocket(int port)创建一个ServerSocket类的对象,port参数传递端口,这个端口就是服务器监听连接请求的端口,如果在这时出现错误将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。
        服务程序从调用ServerSocket的accept()方法开始,直到连接建立。在建立连接后,accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。
    2.客户端程序设计
        当客户程序需要与服务器程序通信时,需在客户机创建一个Socket对象。Socket类有构造函数Socket(InetAddress addr,int port)和Socket(String host,intport),两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAd-dress子类对象通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
        如果创建了一个Socket对象,那么它可通过get-InputStream()方法从服务程序获得输入流读传送来的信息,也可通过调用getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。

    附小程序加以说明:

    服务器端代码:

     1 import java.io.IOException;
     2 import java.io.OutputStream;
     3 import java.net.ServerSocket;
     4 import java.net.Socket;
     5 
     6  
     7 
     8 public class Myserver {
     9 
    10 //建立ServerSocket,并设置其端口号
    11     private ServerSocket ss; 
    12    
    13     public static final int port=8962;
    14     
    15     public Myserver(){
    16     
    17     try{
    18     
    19     ss=new ServerSocket(port);
    20     
    21     }catch(IOException e){
    22     
    23     e.printStackTrace();
    24     }
    25     
    26     }
    27     public void setConnection() throws IOException{
    28    //建立服务器端的Socket 
    29     Socket s;
    30     OutputStream os;
    31     try{ //ServerSocke.accept()t返回一个Socket对象
    32 
    33     s=ss.accept();
    34     os=s.getOutputStream();
    35     os.write("hello".getBytes());
    36     os.close();
    37     s.close();
    38     }catch(IOException e){
    39     
    40     e.printStackTrace();
    41     }
    42     
    43     }
    44 
    45     public static void main(String[] args) throws IOException {
    46     
    47     Myserver ms=new Myserver();
    48     ms.setConnection();
    49   
    50 }
    51 
    52 }

    客户端代码:

     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStream;
     4 import java.io.InputStreamReader;
     5 import java.net.Socket;
     6 
     7  
     8 
     9 public class Myclient {
    10       public static final String IP="172.16.221.134";
    11       public static final int port=8962;
    12       private Socket s;
    13 
    14       public Myclient() throws IOException{
    15 try{
    16    s=new Socket(IP,port); 
    17 
    18 }catch(IOException e){
    19   
    20    e.printStackTrace();
    21 }
    22       }
    23       
    24       public void setConnection()throws IOException{
    25        
    26        InputStream is;
    27        
    28     try{
    29     is=s.getInputStream();
    30     BufferedReader br=new BufferedReader(new InputStreamReader(is));
    31     
    32     System.out.println(br.readLine());
    33     
    34     }catch(IOException e){
    35     
    36     e.printStackTrace();
    37     }   
    38        
    39       
    40       }
    41 public static void main(String args[]) throws IOException{
    42   
    43    Myclient mc=new Myclient();
    44    mc.setConnection();
    45   
    46 }
    47 }

    参考原文:http://www.cnblogs.com/mareymarey111/archive/2011/12/08/2280253.html

  • 相关阅读:
    关于工作流程引擎中的岗位的设置的问题
    将要发布的开源CCOA的照片一览
    关于多个checkbox在IE6下自由表单设计器中的兼容问题
    ccflow流程自动发起功能增加,如何按指定的时间触发方式发起流程?
    Windows 如何远程强行关机
    Report bulder
    微软sample and code down web address
    如何查看sql server的死锁情况
    如何读取数据的所有用户表
    复制和数据库镜像
  • 原文地址:https://www.cnblogs.com/tanghuian/p/4053714.html
Copyright © 2011-2022 走看看