Java(或 Cpp)在某处阻塞

标签 java c++ sockets ssl applet

我有一个客户端/服务器程序和小程序。我将在下面显示代码。您能否告诉我程序阻塞的原因和位置(如果有的话)。小程序似乎坚持但是当我关闭 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 %d\n", 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!\n\r";

        while(1)    {

//            SSL_write( ssl, "hello", sizeof("hello"));
          SSL_read( ssl, recvit, sizeof(recvit));
            cout << recvit << "\n\r";
        }

//      SSL_write(ssl, "Hi :3\n\r", 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.\r\n";
    int recv_stat;
    int connsock = 0;
    char *testsendbuf = "This is very good!\r\n";
    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 的参数,设置一个字符的缓冲区大小,实质上关闭缓冲。这很可能会解决您的问题。

关于Java(或 Cpp)在某处阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596362/

相关文章:

java - 为什么我的 JSF 页面中出现此错误?

c++ - 函数模板参数包不在参数列表的末尾

javascript - Qt WebView控件如何查看错误?

javascript - 如何将变量从路由传递到 server.js

node.js - Express.js - 发送响应之前的 while 循环

c# 简单的服务器来接收来自互联网的连接

java - 为什么 Java 安全点从未达到?线程挂起,安全点超时

c# - 你如何强制构造函数签名和静态方法?

java - 测试容器 : ignore parent `EXPOSE` instruction from Dockerfile

c++ - 如何将<map>存储在<vector>中?