A. 關於ssl多線程參數的傳遞
void *sock_read(int *client) //short event,void *arg
{
char buf[1024];
memset(buf,0,1024);
int d=SSL_read(*client,buf,1024);//接收客戶端的數據包
perror("SSL_read");
printf("d=%d\n",d);
·····
}
static void sock_accept(int server_socket,short event,void *arg)
{
struct event *ev=arg;
int new_server_socket;
////////////////////////////////////////
char sslbuff[MAXBUF +1];
SSL_CTX *ctx;
RSA *rsa;
X509 * client_cert;
char *str;
SSL_load_error_strings();//為列印調試信息做准備
SSL_library_init();//ssl初始化
OpenSSL_add_all_algorithms();//載入ssl演算法
SSL_load_error_strings();//載入ssl錯誤信息
//;
while(1)
{
SSL *ssl;
struct sockaddr_in addr;
socklen_t len=sizeof(addr);
//由於此結構要長期使用,所以rev必須動態分配,否則離開此函數後會自動釋放,導致segment fault
struct event *rev=(struct event *)malloc(sizeof(struct event));
new_server_socket=accept(server_socket,(struct sockaddr *)&addr,&len);
ssl=SSL_new(ctx);
SSL_set_fd(ssl,new_server_socket);
// 建立 SSL 連接
if (SSL_accept(ssl)==-1)
{
close(new_server_socket);
break;
}
client_cert = SSL_get_peer_certificate (ssl); //得到證書並列印信息
if (client_cert != NULL)
{
str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
if(str==NULL)
{
exit(1);
}
free (str);
str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);
if(str==NULL)
{
exit(1);
}
free (str);
X509_free (client_cert);/*如不再需要,需將證書釋放 */
}
else
{
printf ("client does not have certificate.\n");
}
pthread_t child_thread;
pthread_mutex_init(&mutex,NULL);//初始化
if((pthread_create(&child_thread,NULL,(void *)sock_read,(void *)&ssl))<0)//* talk_to_client
if(child_thread!=0)
{
pthread_join(child_thread,NULL);
}
//創建一個讀事件,當有客戶連接時,接收通知。
event_set(rev,new_server_socket,EV_READ,(void*)sock_read,rev);
event_add(rev,NULL);
event_add(ev,NULL);
printf("end sock_accept\n");
free(rev);
// 關閉 SSL 連接
SSL_shutdown(ssl);
SSL_free(ssl);
}
SSL_CTX_free (ctx);
close(new_server_socket);
}
程序中進行的是ssl accept之後參數的傳遞,但是在最上頂的。
B. 使用exe4j打包可運行的exe文件時如何配置jvm的參數,要求這個參數是可以根據需求改變的
可以將參數寫入配置文件里,具體如下,在生成的exe目錄下面在創建一個文件假設你的可運行文件為a.exe,那麼你的jvm虛擬參數文件命名為a.exe.vmoptions。在這個文件寫入你的參數配置就可以了,例如:最小內存設置為64m最大設置為256m,那麼就在配置文件里寫:
-Xms64m
-Xmx256m
注意每個參數都要進行換行
C. java里如何添加自定義的配置文件,jsP里去讀取參數
java里可以再在resources裡面新建一個XML file或者 file文件
XML file 會自動生成XML頭,在下面加入內容就可以了,首先要有一個根節點,然後如果需要用到一些類,如:spring的一些類,就需要引入包,如:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.dist.*.controller" />
</beans >
其中<?xml ……就是頭,<beans 是根節點,下面的<content:……是內容。
如果添加的事properties文件,格式如下:
# 連接池配置
pool.size = 2
pool.max = 50
然後jsp調用讀取xml文件的方法去讀取自重的內容就可以了。
D. C++多線程怎麼實現
C++多線程也可以使用UNIX C的庫函數,pthread_mutex_t,pthread_create,pthread_cond_t,pthread_detach,pthread_mutex_lock/unlock,等等。在使用多線程的時候,你需要先創建線程,使用pthread_create,你可以使主線程等待子線程使用pthread_join,也可以使線程分離,使用pthread_detach。線程使用中最大的問題就是同步問題,一般使用生產著消費者模型進行處理,使用條件變數pthread_cond_t,pthread_mutex,pthread_cond_wait來實現。別人說再多也是別人的,自己看書或者Google去吧。
E. 項目配置文件
Struts應用採用兩個基於XML的配置文件來配置,分別是web.xml和struts-cofig.xml文件.web.xml文件是配置所有web應用的而struts-config.xml文件是struts專用的配置文件,事實上也是可以根據需要給這個配置文件起其他名稱的.
Web應用的發布描述文件:
web應用發布描述文件可以在應用開著者,發布者和組裝者之間傳遞配置信息,Web容器在啟動的時候從該文件中讀取配置信息,根據它來裝載和配置web應用.文檔類型定義DTD對XML文檔的格式做了定義,DTD吧XML文檔劃分為元素,屬性,實體每一種XML文檔都有獨自的DTD文件.可以從網上下載.<web-app>元素是web.xml的根元素,其他元素必須嵌入在<web-app>元素之內.要注意的是子元素也是有順序的比如必須是首先<servlet>,然後<servlet-mapping>最後<taglib>.
為Struts應用配置Web.xml文件:
首先最重要的一步是配置ActionServlet,這個用<servlet>標簽的servlet-name屬性起一個名字叫action,然後用servlet-class屬性指定ActionServlet的類.
然後用<servlet-mapping>標簽的servlet-name屬性指定action,在用url-pattern指定接收范圍是*.do的請求.不管應用中包含了多少子應用,都只需要配置一個ActionServlet,類來出來應用中的不同的功能,其實者就是不必要的,因為Servlet本身就是多線程的,而且目前Struts只允許配置一個ActionServlet.聲明ActionServlet的初始化參數:<servlet>的<init-param>子元素用來配置Servlet的初始化參數.param-name設置config參數名.param-value設置struts-config.xml的路徑參數值.
配置歡迎使用清單:
如果客戶訪問Web的時候值是訪問了WEB應用的根目錄URL.沒有具體的指定文件,Web會自動調用Web的歡迎文件.<welcome-file-list>元素來配置的.通過其中的<welcome-file>歡迎頁面</welcome-file>來配置.
配置錯誤處理:
盡管Struts框架功能強大的錯誤處理機制,但是不能保證處理所有的錯誤或者異常.當錯誤發生時,如果框架不能處理這種錯誤,把錯誤拋棄給Web容器,在默認的情況下web容器會想客戶端返回錯誤信息.如果想避免讓客戶看到原始的錯誤信息,可以在Web應用發布描述文件中配置<error-page>元素.通過<error-code>404來定義錯誤的類型.然後通過<location>要處理錯誤的JSP頁面來對錯誤進行處理.還可以用<exception-type>來設置異常,然後通過<location>來處理異常的JSP頁面來處理異常.
配置Struts標簽庫:
這個就和以前學到的JSP自定義標簽類似,配置元素為<taglib>來配置.<taglib-uri>這個指定標簽庫的uri,類似起一個名稱.<taglib-location>這個是標簽庫的位置也就是實際所在的路徑.通過這樣的方法引入一個標簽庫,然後在前台JSP頁面就可以通過自己定義的URI來調用標簽.
Struts配置文件:
struts-config.xml文件.
首先研討一下org.apache.struts.config包,在struts應用啟動的時候會把Struts配置文件信息讀取到內存中,並把它們存放在config包中相關的JavaBean類的實例中.包中的每一個類都和struts配置文件中特定的配置元素對應,MoleConfig在Struts框架中扮演了十分重要的角色,它是整個config包的核心,在Struts運行時來存放整個應用的配置信息.如果有多個子應用都會有一個MoleConfig對象,它和Struts文件根元素的<struts-config>對應.根元素中包含<form-bean><action><forward>等元素.
<struts-config>元素:時Struts配置文件的根元素,和它對應的配置類MoleConfig類,<struts-config>元素有8個子元素.他們的DTD定義是data-sources?form-bean? global-exception?global-forwards?action-mapping?controller?message-resources?plug-in*在Struts配置文件中,必須按照DTD指定的先手順序來配置<struts-config>元素的各個子元素,如果顛倒了這些子元素的順序,會產生錯誤.
<data-sources>元素:用來配置應用所需要的數據源,數據源負責創建和特定的資料庫的連接.許多數據源採用連接池的機制實現.以便提高資料庫訪問的性能.JAVA語言提供了javax.sql.DataSource介面,所有的數據源都必須實現這個介面.許多應用伺服器和Web伺服器都提供了數據源組件.很多資料庫廠商也提供了數據源的實現.<data-sources>元素包含多個<data-source>子元素永遠配置特定的數據源.他們可以包含多個<set-property>子元素用於設置數據源的各種屬性.配置了數據源以後,就可以在Action類中訪問數據源,在Action中定義了getDataSource(HttpRequest)方法,用於獲取數據源對象的引用.然後可以利用DataSource對象調用getConnection獲取一個連接對象對資料庫進行操作.在配置文件中聲明多個數據源的時候需要為每一個數據源分配唯一的Key值,通過這個來表示特定的數據源.獲取特定的數據源的時候可以用dataSource = getDataSource(reqeust,」A」);
<form-beans>元素:用來配置多個ActionForm,包含一個或者N個<form-bean>子元素.每個<form-bean>元素都包含多個屬性.className指定和<form-bean>匹配的類.name指定該ActionForm的唯一標識符,這個屬性是必須的以後作為引用使用.type指定ActionForm類的完整類名,這個屬性也是必須的.注意包名也要加上.<form-property>是指定動態的Form的元素,以後會深入了解.
<global-exception>元素:用於配置異常處理,元素可以包含一個或者多個<exception>元素,用來設置JAVA異常和異常處理類ExceptionHandler之間的映射.className指定和元素對應的配置類,默認的不用動.handler指定異常處理類默認是ExceptionHandler.key指定在本地資源文件中異常的消息Key,path指定當前異常發生的時候轉發的路徑.scope指定ActionMessages實例存放的范圍.type指定需要處理異常類的名字,必須的.bundle指定Resource Bundle.
<global-forwards>元素:用來聲明全局轉發,元素可以有一個或者N個<forward>元素組成,用於把一個邏輯名映射到特定的URL,通過這種方法Action類或者JSP頁面無需指定URL,只要指定邏輯名稱就可以實現請求轉發或者重定向.這樣可以減少控制組件和視圖的聚合.易於維護.className對應的配置類.contextRelative如果為true表示當path屬性以/開頭的時候,給出的是對應的上下文URL默認是false.name轉發路徑的邏輯名,必須寫.path轉發或者重定向的URL,必須寫必須是以/開頭.redirect設置為true的時候表示執行重定向操作,此項為false的時候,表示執行請求轉發操作.重定向與請求轉發的區別以後就是重定向是把請求生成應答給客戶端然後在重新發送給定向的URL,瀏覽器地址欄會有顯示.而轉發就是直接把請求轉發給本應用的另一個文件,不生成應答所以客戶端IE沒顯示.
<action-mapping>元素:包含一個或者N個<action>元素,描述了從特定的請求路徑到響應的Action的映射.在<action>元素中可以包含多個<exception>和<forward>子元素,他們分別配置局部異常處理和局部轉發.attribute設置Action關聯的ActionForm在request或者session范圍內的key.就是在request或者session共享內的名稱.className對應配置元素的類.默認的是ActionMapping.forward指定轉發URL路徑include指定包含URL路徑.input指定包含表單的URL,當表單驗證失敗的時候發送的URL.name,指定和該Action關聯的Form名字.該名字必須是在form-bean中定義過的,可寫可不寫.path必須/開頭的方位Action的路徑.parameter指定Action配置參數.在Action的execute()方法中可以調用ActionMapping的getParameter()方法來讀取匹配的參數.roles指定允許調用該Action的安全形色,多個角色之間逗號格開.scope指定Form的存在范圍.默認是session.tyep指定Action的完整類名.unknown如果是true表示可以處理用戶發出的所有的無效的ActionURL默認是false.validate指定是否調用ActionForm的validate方法.
<controller>元素:用於配置ActionServlet.buffreSize指定上載文件的輸入緩沖大小.該屬性為可選默認4096.className指定元素對應的配置類,ControllerConfig.然後是contentType指定響應結果內容類型和字元編碼,該屬性為可選,默認是text/html如果在Action或者JSP網頁也設置了類型內容,會覆蓋這個.locale指定是否把Locale對象保存到當前用戶的session中默認false.tempDir指定處理文件上載的臨時工作目錄.nochache如果是true在響應結果中加入特定的頭參數.
<message-resources>元素:用來配置Resource Bundle.用於存放本地文本消息文件.className元素對應的配置類.MessageResourcesConfig.factory指定消息的工廠類.key指定文件存放的Servlet對象中採用的屬性Key.null指定如何處理未知消息.parameter指定消息的文件名.
<plug-in>元素:用於配置Struts插件.
配置多應用模塊:所有的子應用都可以共享同一個ActionServlet實例,但是每個子應用都有單獨的配置文件.把應用劃分為多個子應用模塊.首先為每個應用創建單獨的Struts配置文件,在web.xml的ActionServlet配置代碼中添加幾個子應用信息.採用元素來實現應用之間的切換.
Digester組件:是一個Apache的另一個開源代碼項目.當Struts被初始化的時候,首先會讀取並解析配置文件,框架採用Digester組件來且西配置文件.然後創建config包中的對象.者對象用於存放配置信息.
其實配置文件不難,只要都理其中的原理就OK了.真正實際的項目開發中,採用的工具例如Eclipse系列,提供了相應的插件,在創建一個Struts工程的時候配置文件的標簽都是自動生成的,而我們只需要往裡面填寫屬性就OK了.
F. 按鍵精靈多線程
一看就知道不是新手了!
第一個問題:兩個線程中的delay都是單獨進行的,不會相互影響
第二個問題:應該不行,我測試了一下,當計時器進程結束後就執行再次運行了,但此時主線程還在運行,這樣就有多個主線程同時執行了
第三個問題:多線程太亂,不如do...loop until datediff("",,)簡潔,循環多沒辦法的,要不就用配置文件來判斷進程情況,還有就是自己寫函數或者插件吧
期待你補充問題
G. Linux多線程編程:如何從一個配置文件中讀取一個數,然後根據這個數來決定運行的線程數,希望能有點代碼!
配置文件為 conf.txt
測試代碼如下,注意鏈接的時候加上 -lpthread 這個參數
#include <stdio.h>
#include <errno.h> //perror()
#include <pthread.h>
#include <unistd.h> //sleep()
#include <time.h> // time()
#include <stdlib.h> //rand()
#define FD "conf.txt"
typedef void *(*fun)(void *);
struct my_struct
{
unsigned time_to_wait;
int n;
};
void *test_thread(struct my_struct *);
int main (int argc, char const *argv[])
{
FILE *fp = fopen(FD, "r");
if (fp == NULL)
{
perror(FD);
return -1;
}
srand((unsigned)time(NULL)); //初始化隨機種子
int thread_count;
fscanf(fp, "%d", &thread_count);
fclose(fp);
if (thread_count <= 0)
{
printf("線程數<1,退出程序。\n");
return -1;
}
pthread_t *ptid = (pthread_t *)malloc(sizeof(pthread_t) * thread_count); //保存線程ID
int i;
for (i = 0; i < thread_count; i++)
{
int tw = rand() % thread_count + 1; //隨機等待時間
struct my_struct * p = (struct my_struct *)malloc(sizeof(struct my_struct));
if (p == NULL)
{
perror("內存分配錯誤");
goto ERROR;
}
p->time_to_wait = tw;
p->n = i + 1;
int rval = pthread_create(ptid + i, NULL, (fun) test_thread, (void *)(p)); //注意這里的強制轉換(兩個)
if (rval != 0)
{
perror("Thread creation failed");
goto ERROR;
}
//sleep(1); //這句加也可以,不加也可以。最開始的時候加上這個是為了讓兩個線程啟動的時候之間有一定的時間差
}
printf("主線程啟動\n\n");
fflush(stdout);
for (i = 0; i < thread_count; i++)
{
pthread_join(*(ptid + i), NULL); //等待所有線程退出。
}
printf("\n主線程退出\n");
ERROR:
free(ptid);
return 0;
}
void *test_thread(struct my_struct * p) //線程啟動的時候運行的函數
{
printf("第%d個線程啟動,預計運行%d秒\n", p->n, p->time_to_wait);
fflush(stdout);
sleep(p->time_to_wait); //讓線程等待一段時間
printf("第%d個線程結束\n", p->n);
fflush(stdout);
free(p);
return NULL;
}
你的第二個問題我在網路HI回你了~