Java(或Cpp)某处阻塞

Java (or Cpp) Blocking Somewhere

本文关键字:Cpp Java      更新时间:2023-10-16

我有一个客户端/服务器程序和小程序。我将在下面显示代码。你能告诉我程序被屏蔽的原因和位置吗。小程序似乎很粘,但当我关闭Cpp端时,它就完成了执行。这是代码(我省略了导入和包含)。

public class first extends JApplet  {
    PrintWriter toServer = null;
    BufferedReader fromServer = null;
    public void init() {
        System.setProperty("javax.net.ssl.keyStore", "javakeys");
        System.setProperty("javax.net.ssl.keyStorePassword", "javakeys");
try {
        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 4000);
        toServer = new PrintWriter(sslsocket.getOutputStream(), true);
        InputStreamReader isr = new InputStreamReader(sslsocket.getInputStream());
        fromServer = new BufferedReader(isr);
    } catch (Exception exception) {
            exception.printStackTrace();
    }
        toServer.println("Flystar".getBytes()); 
    }
    public void paint(Graphics g) {
        g.setColor( Color.red );
        g.drawString("Welcome to Java!!", 50, 60 );
    }

}

这是Cpp

int conn_new_server( int );
__attribute__((constructor)) void construct_ssl()
{
    SSL_load_error_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
}
__attribute__((destructor)) void destruct_ssl()
{
    ERR_free_strings();
    EVP_cleanup();
}
int main()
{
    int sockfd, client;
    SSL_CTX *tlsctx;
    SSL *ssl;
    char recvit[256];
    printf("Status %dn", RAND_status());
    tlsctx = SSL_CTX_new( TLSv1_server_method());
    SSL_CTX_set_options(tlsctx, SSL_OP_SINGLE_DH_USE);
    SSL_CTX_use_certificate_file(tlsctx, "server.crt" , SSL_FILETYPE_PEM);
    SSL_CTX_use_PrivateKey_file(tlsctx, "server.key", SSL_FILETYPE_PEM);
    sockfd = conn_new_server( 1337 );
    while (1)
    {
        client = accept(sockfd, NULL, NULL);
        ssl = SSL_new(tlsctx);
        SSL_set_fd(ssl, client);
        SSL_accept(ssl);
        cout << "connection detected!nr";
        while(1)    {
//            SSL_write( ssl, "hello", sizeof("hello"));
          SSL_read( ssl, recvit, sizeof(recvit));
            cout << recvit << "nr";
        }
//      SSL_write(ssl, "Hi :3nr", 6);
        SSL_shutdown(ssl);
        SSL_free(ssl);
//       close(client);
    }
    SSL_CTX_free(tlsctx);
 //   close(sockfd);
    return 0;
}

int conn_new_server( int port)
{
    WSADATA g_wsadata;      // Winsock data holder
    int err;
    StartSocketLib;
    char *messageman = "Hello.rn";
    int recv_stat;
    int connsock = 0;
    char *testsendbuf = "This is very good!rn";
    list<int> socklist;
    // BEGIN CODE BLOCK 2.3 - Create a Listening Socket on port 4000
    int sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( sock == -1 ) {
        cout << "Socket creation error!" << endl;
        return 0;
    }
    cout << "Socket created!  Standing By." << endl;
// create a sockaddr_in for binding, listening on port 4000
    struct sockaddr_in socketaddress;
    socklen_t sa_size = sizeof( struct sockaddr_in );
    socketaddress.sin_family = AF_INET;
    socketaddress.sin_port = htons( 4000 );
    socketaddress.sin_addr.s_addr = htonl( INADDR_ANY );
    memset( &(socketaddress.sin_zero), 0, 8 );
    // bind the socket
    err = bind( sock, (struct sockaddr*)&socketaddress, sa_size );
    // listen on the socket
    err = listen( sock, 16 );

这里的首要问题是使用BufferedReader。在向您返回任何数据之前,它将尝试填充内部缓冲区,如果没有足够的数据来填充缓冲区,它将阻塞。如果您使用BufferedReader只是为了获得readLine()方法——这就是您在这里所做的——那么在构造它时,传递1的第二个构造函数参数,以设置一个字符的缓冲区大小,实质上关闭缓冲。这很可能会解决你的问题。