temz 2023-03-17 12:11 采纳率: 100%
浏览 66
已结题

C#客户端与java服务器如何作SSL socket通讯

C#客户端与java服务器如何作SSL socket通讯,有没有能实现的牛人给下代码例程看看

  • 写回答

7条回答 默认 最新

  • dahe0825 2023-03-17 12:20
    关注

    参考GPT和自己的思路,以下是建立 C# 客户端与 Java 服务器之间的 SSL socket 通讯的详细代码示例:

    Java 服务器端代码:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import javax.net.ssl.SSLServerSocketFactory;
    import javax.net.ssl.SSLSocketFactory;
    
    public class SSLServer {
        public static void main(String[] args) throws Exception {
            int port = 8080;
    
            // 加载 SSL 证书
            System.setProperty("javax.net.ssl.keyStore", "server_keystore.jks");
            System.setProperty("javax.net.ssl.keyStorePassword", "password");
    
            // 创建 SSL socket 工厂
            SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    
            // 创建服务器 socket
            ServerSocket serverSocket = sslServerSocketFactory.createServerSocket(port);
    
            System.out.println("服务器已启动,监听端口:" + port);
    
            while (true) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
    
                System.out.println("客户端已连接:" + clientSocket.getInetAddress());
    
                // 创建输入输出流
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    
                // 从客户端读取消息
                String message = in.readLine();
    
                System.out.println("接收到客户端的消息:" + message);
    
                // 向客户端发送响应消息
                out.println("服务器响应:" + message);
    
                // 关闭流和客户端 socket
                in.close();
                out.close();
                clientSocket.close();
            }
        }
    }
    
    

    C# 客户端代码:

    
    using System;
    using System.IO;
    using System.Net.Security;
    using System.Net.Sockets;
    using System.Security.Authentication;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    
    public class SSLClient {
        public static void Main() {
            int port = 8080;
    
            // 创建 SSL 证书集合
            X509CertificateCollection certCollection = new X509CertificateCollection();
            certCollection.Add(new X509Certificate2("client_certificate.pfx", "password"));
    
            // 创建 SSL 流
            TcpClient client = new TcpClient("localhost", port);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
    
            // 客户端认证
            sslStream.AuthenticateAsClient("localhost", certCollection, SslProtocols.Tls12, false);
    
            Console.WriteLine("客户端已连接服务器");
    
            // 向服务器发送消息
            string message = "你好,服务器!";
            byte[] messageBytes = Encoding.UTF8.GetBytes(message);
            sslStream.Write(messageBytes);
            sslStream.Flush();
    
            Console.WriteLine("已向服务器发送消息:" + message);
    
            // 接收服务器的响应消息
            byte[] buffer = new byte[2048];
            int bytesRead = sslStream.Read(buffer, 0, buffer.Length);
            string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
    
            Console.WriteLine("接收到服务器的响应消息:" + response);
    
            // 关闭 SSL 流和客户端 socket
            sslStream.Close();
            client.Close();
        }
    
    private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
        if (sslPolicyErrors == SslPolicyErrors.None) {
            return true;
        }
    
        Console.WriteLine("SSL 证书验证失败:" + sslPolicyErrors);
        return false;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘