socket通信,你还会实现么?

简介: socket通信,你还会实现么?

前言

最近碰到好几个朋友问我,如何实现一个简单的Socket通信。因为好多情况下,还在使用socket通信,来进行数据的传输。比如银行业务。

今天我们就上一个简单的demo。

客户端

闲言碎语不多絮,通信的双方,称为客户端、服务端。

Socket通信,采用的tcp协议,将数据转为流的形式,进行传输。

客户端代码如下:

/**
* User: 小隐乐乐
* Date: 2020-08-10
* Time: 10:22
* Description:
* Socket通信客户端
*/
public class Client {
   public static void main(String[] args) {
       Socket socket = null;
       OutputStream os = null;
       PrintWriter pw = null;
       InputStream is = null;
       InputStreamReader isr = null;
       BufferedReader br = null;
       try {
           socket = new Socket("127.0.0.1", 9090);
           // 获取输出流向服务端写入数据
           os = socket.getOutputStream();
           pw = new PrintWriter(os);
           pw.write("用户名:admin 密码:123");
           pw.flush();
           socket.shutdownOutput();
           // 获取输入流接受服务端返回的信息
           is = socket.getInputStream();
           isr = new InputStreamReader(is);
           br = new BufferedReader(isr);
           String message = null;
           while ((message = br.readLine()) != null) {
               System.out.println("服务端说:" + message);
          }
           socket.shutdownInput();
      } catch (UnknownHostException e) {
           e.printStackTrace();
      } catch (IOException e) {
           e.printStackTrace();
      } finally {
           try {
               if (br != null) {
                   br.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (isr != null) {
                   isr.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (is != null) {
                   is.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           if (pw != null) {
               pw.close();
          }
           try {
               if (os != null) {
                   os.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (socket != null) {
                   socket.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }
}

非常简单,没有过多装饰的demo代码,提供大家以参考

服务端

服务端,进行接收客户端数据,完成处理后,响应客户端。一般来说,都是保持短连接状态,即,发送 -> 接收 -> 响应 -> 结束。

至于,长连接、短连接的区分,以及如何选择,大家可以自行学习。此处不多做介绍。

服务端代码如下:

/**
* User: 薛乐乐
* Date: 2020-08-10
* Time: 10:22
* Description:
* 服务端线程类
*/
public class ServerSocketThread extends Thread{
   private Socket socket;
   public ServerSocketThread(Socket socket) {
       this.socket = socket;
  }
   @Override
   public void run() {
       InputStream is = null;
       InputStreamReader isr = null;
       BufferedReader br = null;
       OutputStream os = null;
       PrintWriter pw = null;
       try {
           // socket获取字节输入流
           is = socket.getInputStream();
           // 将字节输入流转字符输入流
           isr = new InputStreamReader(is);
           // 将字符输入流转行输入流
           br = new BufferedReader(isr); //
           String message = null;
           while ((message = br.readLine()) != null) {
               System.out.println("客户端发来消息:" + message);
          }
           // 必须先关闭输入流才能获取下面的输出流
           socket.shutdownInput();
           // 获取输出流
           os = socket.getOutputStream();
           pw = new PrintWriter(os);
           pw.write("欢迎您进入socket");
           pw.flush();
           // 关闭输入流
           socket.shutdownOutput();
      } catch (Exception e) {
           e.printStackTrace();
      } finally {
           // 关闭资源
           if (pw != null) {
               pw.close();
          }
           try {
               if (br != null) {
                   br.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (isr != null) {
                   isr.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (os != null) {
                   os.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (br != null) {
                   br.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (isr != null) {
                   isr.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
           try {
               if (is != null) {
                   is.close();
              }
          } catch (IOException e) {
               e.printStackTrace();
          }
      }
  }
}
/**
* User: 薛乐乐
* Date: 2020-08-10
* Time: 10:22
* Description:
* Socket通信服务端
* 1:建立服务端监听socket
* 2:等待接受连接请求
* 3:接受请求后建立socket连接
* 4:输入、输出流
* 5:关闭socket以及相关资源
*/
public class Server {
   private static ServerSocket SERVER_SOCKET =null;;
   static{
       try {
           SERVER_SOCKET = new ServerSocket(9090);
      } catch (IOException e) {
           e.printStackTrace();
      }
  }
   public static void main(String[] args) {
       try {
           System.out.println("******服务器已启动,等待客户端连接*****");
           Socket socket = null;
           while(true){
               //循环监听客户端的连接
               socket = SERVER_SOCKET.accept();
               //新建一个线程ServerSocket,并开启
               new ServerSocketThread(socket).start();
          }
      } catch (IOException e) {
           e.printStackTrace();
      }
  }
}

服务端,循环监听客户端的连接,进行数据交互。

demo奉上,希望大家能够理解。更多的,原理内容,可以回顾java 核心的通信篇。

目录
相关文章
|
4月前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
140 1
|
2月前
|
Python
python socket 简单通信
python socket 简单通信
37 1
|
2月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
142 0
|
4月前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
328 10
|
4月前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
50 3
|
4月前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
41 1
|
4月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
81 0
|
4月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
82 0
|
21天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【8月更文挑战第27天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。