欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

socket网络编程实现客户端和服务端通信

程序员文章站 2022-07-01 15:30:30
...

    之前的博客分享过远程备份oracle数据库的代码,但是因为情况变动,代码部署的服务器和数据库服务器不是一个,并且代码部署所在服务器没有oracle的客户端,因此之前的实现策略只能舍弃。尝试一个新的方法:socket编程,本篇博客以Java.net.Socket为demo简单介绍下。


什么是socket编程


 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;如果说HTTP是轿车,提供了封装或者显示数据的具体形式;那么Socket是发动机,提供了网络通信的能力。

Socket与ServerSocket的交互:

   盗了一张图,我觉得介绍的特别清楚。客户端new Socket('主机号','端口号');服务端new ServerSocket('端口号');并且通过accept()方法进行监听,等待连接;它们都是通过输入输出流交换数据。可以根据自己的需要将输入输出流包装成其他流。

socket网络编程实现客户端和服务端通信

实现demo:
客户端:

 public static void main(String[] args){
    try{
      //1、创建客户端Socket,指定服务器地址和端口
      Socket socket =new Socket("127.0.0.1",9086);
      //2、获取输出流,向服务器端发送信息
      OutputStream os = socket.getOutputStream();//字节输出流
      PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流
      pw.write("用户名:admin;密码:admin");
      pw.flush();
      socket.shutdownOutput();
      
      //3、获取输入流,并读取服务器端的响应信息
      InputStream is = socket.getInputStream();
      BufferedReader br = new BufferedReader(new InputStreamReader(is));
      String info = null;
      while((info=br.readLine())!=null){
        System.out.println("Receive from server message=: "+info);
      }
      
      //4、关闭资源
      br.close();
      is.close();
      pw.close();
      os.close();
      socket.close();
    }catch(IOException e){
      System.out.println(e);
    }
  }
服务端:

public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = null;
    Socket socket = null;
    Reader reader = null;
    OutputStream os = null;
    PrintWriter pw = null;
    try{
      //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
      serverSocket =new ServerSocket(9086);//1024-65535的某个端口
      //2、调用accept()方法开始监听,等待客户端的连接
      socket = serverSocket.accept();
      //3、获取输入流,并读取客户端信息
      reader = new InputStreamReader(socket.getInputStream());
      char chars[] = new char[1024];
      int len;
      String strClient = "";
      while ((len=reader.read(chars)) != -1) {
        strClient=new String(chars, 0, len);
        System.out.println("Receive from client message=: " + strClient);
      }
      socket.shutdownInput();//关闭输入流
      //4、获取输出流,响应客户端的请求
      os = socket.getOutputStream();
      pw = new PrintWriter(os);
      pw.write("Hello World");
      pw.flush();
      //5、关闭资源
      pw.close();
      os.close();
      reader.close();
      socket.close();
      serverSocket.close();
    }catch(IOException e){
      e.printStackTrace();
    }

输出结果:

   client输出:

   Receive from server message=: Hello World

   Server输出:
   Receive from client message=: 用户名:admin;密码:admin


    客户端和服务端代码放在不同的服务器上面,客户端需要服务端的ip地址和端口号,与服务端的端口号相符合就建立起连接,聊天工具大概就是这种实现的。