zoukankan      html  css  js  c++  java
  • java的服务端与客户端通信(1)

    一、理解socket

    1.1什么是socket?

    • socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
    • Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过Socket类及其子类完成的。

    1.2重要的socket

    • java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法:

      1.accept方法

    用于产生"阻塞",直到接收到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

      2.getInputStream方法 

    连接的另一端将得到输入,同时返回一个OutputStream对象实例。

          注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

        3.getOutputStream方法

            连接的另一端将得到输入,同时返回一个OutputStream对象实例。

               注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

    1.3Socket通信原理

        服务器:使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

            客户端:使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的动态的分配一个1024以上的端口。

      ServerSocket类
      ServerSocket myListener = new ServerSocket(600);
      提供监听服务的端口是600,不同服务之间通过端口来区别。为了随时监听可能的Client端的请求,执行如下语句:
      Socket linkSockt = myListener.accept();这个方法执行将使得Server端处于等待状态,直到接收一个来自Client端的请求,并返回一个与Client通信的Socket对象。    

      Server端与Client端连接后,就实现了相互读写数据,结束通信执行:
      myListener.close();

      Socket类
      Client需从Server获取服务时,应创建一个Socket对象:
      Socket mySocket = new Socket(host,port);
      连通后,利用Socket类方法getOutputStream()获取(write)输出流,和getInputStream()获取(read)输入流。结束通信同样是
      mySocket.close();
      ServerSocket一般仅用于设置端口号和监听,真正进行通信的是Server端的Socket与Client端的Socket,在ServerSocket进行accept后,就将主动权转让给Server端的Socket。

    二、socket编程范例及运行过程!

    流程图如下:      

                                                 

     客户端代码:

     1 import java.net.Socket;
     2 import java.io.InputStream;
     3 import java.io.OutputStream;
     4 import java.io.PrintWriter;
     5 import java.io.BufferedReader;
     6 import java.io.InputStreamReader;
     7 import java.io.IOException;
     8 import java.net.UnknownHostException;
     9 
    10 public class ClientText {
    11     
    12       public static final String ip="127.0.32.42";
    13       public static int port=7890;
    14       private Socket client_s;
    15     
    16       public ClientText(){
    17         try{
    18           client_s=new Socket(ip,port);
    19         }catch(UnknownHostException e){
    20           e.printStackTrace();
    21         }catch(IOException c){
    22           c.printStackTrace();
    23         }
    24       }
    25       
    26       public void setConnection() throws IOException{
    27         InputStream is;
    28         OutputStream os;
    29         try{
    30           is=client_s.getInputStream();
    31           os=client_s.getOutputStream();
    32           BufferedReader sys_br=new BufferedReader(new InputStreamReader(System.in));
    33           BufferedReader client_br=new BufferedReader(new InputStreamReader(is)); 
    34           PrintWriter client_pw=new PrintWriter(os,true);
    35            String warnStr=null;
    36           if((warnStr=client_br.readLine())!=null){
    37             System.out.println(warnStr);
    38           }
    39           while((warnStr=sys_br.readLine())!=null){
    40             client_pw.println(warnStr);
    41             break;
    42             }
    43         }catch(IOException e){
    44               e.printStackTrace();
    45         }
    46       }
    47       
    48     public static void main(String[] args) {
    49         // TODO 自动生成的方法存根
    50          ClientText myclient=new ClientText();
    51             try {
    52                 myclient.setConnection();
    53             } catch (IOException e) {
    54                 // TODO 自动生成的 catch 块
    55                 e.printStackTrace();
    56             }
    57     }
    58 
    59 }

    服务端代码:

     1 import java.io.IOException;
     2 import java.net.ServerSocket;
     3 import java.net.Socket;
     4 import java.io.InputStream;
     5 import java.io.OutputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.PrintWriter;
     8 import java.io.BufferedReader;
     9 
    10 public class ServerText{
    11 
    12   private ServerSocket ss; 
    13   public static final int port=7890;
    14   
    15   public ServerText(){
    16     try{
    17       ss=new ServerSocket(port);
    18     }catch(IOException e){
    19       e.printStackTrace();
    20     }
    21   }
    22   
    23   public void setConnection()throws IOException{
    24     Socket server_s;
    25     OutputStream os;
    26     InputStream is;
    27     try{
    28       //服务器程序陷入阻塞状态,随时接受客户端的链接
    29       server_s=ss.accept();
    30       //接收并连接之后
    31       os=server_s.getOutputStream();
    32       is=server_s.getInputStream();
    33       //给客户端发送数据
    34       PrintWriter server_pw=new PrintWriter(os,true);
    35       //接收客户端的数据
    36       BufferedReader server_br=new BufferedReader(new InputStreamReader(is));
    37       String msg=null;
    38       server_pw.println("连接成功,请输入一些数据传递到服务端");
    39       if((msg=server_br.readLine())!=null){
    40         System.out.println("客户端传递过来的数据为:"+msg);
    41         server_pw.println("数据传输成功");
    42       }else{
    43         server_pw.println("数据传输失败,出现错误");
    44       }
    45     }catch(IOException e){
    46       e.printStackTrace();
    47     } 
    48   }
    49 
    50   public static void main(String args[]) throws IOException{
    51          ServerText server_text=new ServerText();
    52          server_text.setConnection();
    53      
    54       }  
    55 }

    运行结果:

      客户端:

      服务端:

    以上就是简单的socket的通信过程。

     

  • 相关阅读:
    Flask、Vue部署总结
    Recat教程(二)
    C第一个程序
    React教程(一)
    Flask+uwsgi+nginx 部署
    使用Dockerfile部署简单的应用
    Typescript搭建开发环境
    Typescript模块化/命名空间/装饰器
    Typescript的泛型/泛型接口
    修改git密码后,终端fatal: Authentication failed for'http://xxx/xxx.git'
  • 原文地址:https://www.cnblogs.com/MenAngel/p/5317082.html
Copyright © 2011-2022 走看看