Java(或Cpp)某处阻塞
Java (or Cpp) Blocking Somewhere
我有一个客户端/服务器程序和小程序。我将在下面显示代码。你能告诉我程序被屏蔽的原因和位置吗。小程序似乎很粘,但当我关闭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
的第二个构造函数参数,以设置一个字符的缓冲区大小,实质上关闭缓冲。这很可能会解决你的问题。
相关文章:
- Android Java USB for native cpp
- CPP和Java提供不同的输出
- 在Java项目中使用CPP和OpenCV项目的.so文件
- 我可以通过CPP程序中的数据库调用调用Java程序
- CMAKE 将 java 库添加到 cpp 项目中
- 如何从 Java 调试 CPP DLL
- 使用 JNI 从 cpp 调用 java 方法时出现异常
- 如何在 Java 中加载 cpp 库时避免异常
- 通过字符串将wav数据从Java发送到Cpp
- Android NDK调用java方法表单cpp
- 从 CPP 到 Java 的转换 (dp =1)
- Java(或Cpp)某处阻塞
- 通过套接字从Java向CPP发送屏幕截图-发出接收图像
- 在openJDK构建系统中,unsafe.cpp如何链接到unsafe.java
- 使用c++类在黑莓或转换cpp文件到java
- 请解释为什么列表<A>投射到 List<A.super>在 Cpp、Java 和 C# 中允许或不允许
- 我如何发送cpp回调函数指针到java
- 存储Cpp中可读的java字节数组
- cpp 中类似 Java 的类类
- 将现有的C++(.h 和 .cpp)文件转换为 Java for Android