2016年6月23日
摘要: 1財(cái)務(wù)制度題庫(kù) 單選題 1.下列各會(huì)計(jì)要素,( )不是反映財(cái)務(wù)狀況的會(huì)計(jì)要素。 A.資產(chǎn) B.負(fù)債 C.收入  ...
閱讀全文
var ssshsj = new Date( $("#ssshsj").val().replace(/-/g,"/"));
對(duì)于Ibatis操作Date/Time/DateTime,總結(jié)如下:
將pojo的屬性類型設(shè)置為java.sql.Date(或java.sql.Time, java.sql.Timestamp),此時(shí)會(huì)嚴(yán)格遵循這三種類型的語(yǔ)義。但此方法因存在前文中提到的性能問(wèn)題,在JDK1.6以前的JDK版本中能少使用就少使用。
如果你想在pojo中使用java.util.Date, 則要注意:
完整的日期時(shí)間,要確保jdbcType為空,或?yàn)镈ATE,TIME以外的值
只需要時(shí)間,要指定jdbcType=”TIME”
只需要日期,要指定jdbcType=”DATE”
final OutputStream out = new FileOutputStream("D:/EDI/EDi.zip"); //實(shí)例文件輸出流
ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);
//實(shí)例化存檔輸出流,工廠方法創(chuàng)建zip的存檔輸出流
// File f1 = new File(file.getPath());
os.putArchiveEntry(new ZipArchiveEntry(file.getName())); //生成存檔文件名
IOUtils.copy(new FileInputStream(file), os); //添加拷貝存檔文件
os.closeArchiveEntry();
os.close();
//*************************
try {
File input = new File("D:/EDI/EDi.zip");//獲得下載文件路徑
contentType="application/octet-stream";
docStream = new FileInputStream(input);//獲得輸入流名稱
contentDisposition =URLEncoder.encode(input.getName() ,"UTF-8");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "download";
WEBWORK的文件下載機(jī)制。使用起來(lái)還是比較簡(jiǎn)單的。下面是用法說(shuō)明:
首先在一個(gè)ACTION中,如果判斷有權(quán)限進(jìn)行文件下載。
則:
1、讀出該下載文件,并生成一個(gè)流。 文件名應(yīng)當(dāng)從請(qǐng)求的request中讀出,或從用戶的表中取出。
public String downLoadFile(String fileName){
try {
File input = new File("e:/engilish literature.doc");
docStream = new FileInputStream(input);
contentDisposition = "test.txt";
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "download";
}
2、將輸出導(dǎo)向到一個(gè)特殊的RESULT中去。叫做Steam Result。
<action name="register" class="com.job2easy.web.user.RegisterAction">
<result name="success" type="dispatcher">
<param name="location">/home/register-result.jsp</param>
</result>
<result name="input">
<param name="location">/home/register.jsp</param>
</result>
<result name="download" type="stream">
<param name="contentType">application/x-msdownload</param>
<param name="inputName">docStream</param>
<param name="bufferSize">1024</param>
<param name="contentDisposition">attachment;filename="${contentDisposition}"</param>
</result>
<interceptor-ref name="params"/>
</action>
3、這中間有幾個(gè)參數(shù)需要配置:
contentType設(shè)成 application/x-msdownload 就可以。這樣瀏覽器會(huì)保證彈出一個(gè)下載文件的對(duì)話框。
inputName 這個(gè)比較重要,這個(gè)名字是輸入流的名稱, 以后要steam result的實(shí)現(xiàn)類中為根據(jù)OGNL的表達(dá)式去查找的。
contentDisposition 這個(gè)是下載之后,保存在用戶端的文件名稱。${contentDisposition} 看一下代碼。如果寫成上述的方式,就有機(jī)會(huì)在ACTION中設(shè)置文件名。
4、另外一個(gè)參數(shù):contentLength就是下載文件的大小,webwork的stream result似乎實(shí)現(xiàn)有問(wèn)題,不能根據(jù)文件的大小動(dòng)態(tài)進(jìn)行設(shè)置,只能寫死。
這個(gè)參數(shù)的意義是告訴瀏覽下載的文件有多大,以便瀏覽器正確的顯示進(jìn)度條。如果這個(gè)功能很重要的話,可以重新寫一個(gè)RESULT來(lái)實(shí)現(xiàn)。
http://blog.csdn.net/jackfrued/article/details/44921941
數(shù)據(jù)列出來(lái)如下:
ID NAME COUR SCORE
--- ------- ---- -----
1 name_1 語(yǔ)文 33
1 name_1 數(shù)學(xué) 63
1 name_1 英語(yǔ) 71
1 name_1 歷史 68
1 name_1 化學(xué) 94
2 name_2 語(yǔ)文 85
2 name_2 數(shù)學(xué) 4
2 name_2 英語(yǔ) 98
2 name_2 歷史 9
2 name_2 化學(xué) 12
3 name_3 語(yǔ)文 49
3 name_3 數(shù)學(xué) 96
3 name_3 英語(yǔ) 30
3 name_3 歷史 60
3 name_3 化學(xué) 2
要實(shí)現(xiàn)的行轉(zhuǎn)列的效果如下(或者類似的結(jié)果):
ID NAME SCORES
--- ------- --------------------
1 name_1 33,63,71,94,68
2 name_2 85,4,98,12,9
3 name_3 49,2,60,96,30
通過(guò)case表達(dá)式
select id,name,sum(case when course='語(yǔ)文' then score end) "語(yǔ)文",
sum(case when course='數(shù)學(xué)' then score end) "數(shù)學(xué)",
sum(case when course='英語(yǔ)' then score end) "英語(yǔ)",
sum(case when course='歷史' then score end) "歷史",
sum(case when course='化學(xué)' then score end) "化學(xué)"
from HANG2LIE
group by id,name;
union有去重功能:
結(jié)構(gòu)如下:
ID NAME Chinese Math English History Chemistry
--- ------- ---------- ---------- ---------- ---------- ----------
2 name_2 85 4 98 9 12
1 name_1 33 63 71 68 94
3 name_3 49 96 30 60 2
我們要實(shí)現(xiàn)如下的查詢效果:列轉(zhuǎn)行
ID NAME COUR SCORE
--- -------- ---- -----
2 name_2 語(yǔ)文 85
1 name_1 語(yǔ)文 33
3 name_3 語(yǔ)文 49
2 name_2 數(shù)學(xué) 4
1 name_1 數(shù)學(xué) 63
3 name_3 數(shù)學(xué) 96
2 name_2 英語(yǔ) 98
1 name_1 英語(yǔ) 71
3 name_3 英語(yǔ) 30
2 name_2 歷史 9
1 name_1 歷史 68
3 name_3 歷史 60
2 name_2 化學(xué) 12
1 name_1 化學(xué) 94
3 name_3 化學(xué) 2
1、集合查詢
實(shí)現(xiàn)的SQL語(yǔ)句:
select id,name,'語(yǔ)文' course,chinese score from lie2hang
union
select id,name,'數(shù)學(xué)' course,math score from lie2hang
union
select id,name,'英語(yǔ)' course,english score from lie2hang
union
select id,name,'歷史' course,history score from lie2hang
union
select id,name,'化學(xué)' course,chemistry score from lie2hang;
select * from (select A.*, rownum rn from T_CD_LOC A where rownum > 20) where rn <41 錯(cuò)
select * from (select t.* ,rownum rn from T_CD_LOC t where rownum<=40) where rn>=20 對(duì)
firstIndex=0
pageNumber
pageSize=20
select * from (select A.*,rownum rn from T_CD_LOC a where rownum < ((firstIndex+pageNumber+1)*pageSize) where rn >((firstIndex+pageNumber)*pageSize)
js被緩存了,加控制版本 <script src="../lib_js/paymentplan.js?v=1"></script>
摘要: EhCache 分布式緩存/緩存集群開發(fā)環(huán)境:System:WindowsJavaEE Server:tomcat5.0.2.8、tomcat6JavaSDK: jdk6+IDE:eclipse、MyEclipse 6.6 開發(fā)依賴庫(kù):JDK6、 JavaEE5、ehcache-core-2.5.2.jarEmail:hoojo_@126.comBlog:http://blog.csdn...
閱讀全文
3、JConsole監(jiān)控
JMX(Java Management Extensions)是一個(gè)為應(yīng)用程序植入管理功能的框架。JMX是一套標(biāo)準(zhǔn)的代理和服務(wù),實(shí)際上,用戶可以在任何Java應(yīng)用程序中使用這些代理和服務(wù)實(shí)現(xiàn)管理。可以利用JDK的JConsole來(lái)訪問(wèn)Tomcat JMX接口實(shí)施監(jiān)控,具體步驟如下:
1)首先,打開Tomcat5的bin目錄中的catalina.bat文件,添加:
JAVA_OPTS="-Xms512m -Xmx512m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=64m -Djava.rmi.server.hostname=192.168.222.132 -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
-Dcom.sun.management.jmxremote:代表開啟JMX的管理功能
2)重啟tomcat,并查看監(jiān)控端口(上面配置的1090)是否已啟動(dòng)
3)打開jdk的bin目錄(如C:\Program Files\Java\jdk1.7.0_17\bin)下的JConsole,并輸入iP和監(jiān)控端口進(jìn)行連接

監(jiān)控結(jié)果:

http://www.itzhai.com/hibernate-one-to-many-association-mapping-configuration-and-the-cascade-delete-problem.html首先舉一個(gè)簡(jiǎn)單的一對(duì)多雙向關(guān)聯(lián)的配置:
一的一端:QuestionType類
package com.exam.entity;
import java.util.Set;
public class QuestionType {
private String typeName;
private char typeUniqueness;
private Set quesion;
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public char getTypeUniqueness() {
return typeUniqueness;
}
public void setTypeUniqueness(char typeUniqueness) {
this.typeUniqueness = typeUniqueness;
}
public Set getQuesion() {
return quesion;
}
public void setQuesion(Set quesion) {
this.quesion = quesion;
}
}
配置文件:
<hibernate-mapping package="com.exam.entity">
<class name="QuestionType" table="exam_question_type">
<id name="typeName" column="type_name"></id>
<property name="typeUniqueness" column="type_uniqueness"/>
<set name="quesion" inverse="true" cascade="delete">
<key column="question_type_name"/>
<one-to-many class="Question"/>
</set>
</class>
</hibernate-mapping>
多的一端:Question類
package com.exam.entity;
import java.util.Date;
public class Question {
private int questionNo;
private QuestionType questionType;
private String questionsTitle;
public int getQuestionNo() {
return questionNo;
}
public void setQuestionNo(int questionNo) {
this.questionNo = questionNo;
}
public QuestionType getQuestionType() {
return questionType;
}
public void setQuestionType(QuestionType questionType) {
this.questionType = questionType;
}
public String getQuestionsTitle() {
return questionsTitle;
}
public void setQuestionsTitle(String questionsTitle) {
this.questionsTitle = questionsTitle;
}
}
配置文件:
<hibernate-mapping package="com.exam.entity">
<class name="Question" table="exam_question">
<id name="questionNo" column="question_no" >
<generator class="increment" />
</id>
<many-to-one name="questionType" column="question_type_name"/>
<property name="questionsTitle" column="questions_title" length="200" />
</class>
</hibernate-mapping>
首先說(shuō)明一下一些常用的屬性:
<many-to-one>元素包含以下屬性:
name:設(shè)定映射的持久化類的屬性名
column:設(shè)定和持久化類的屬性對(duì)應(yīng)的表的外鍵
class:設(shè)定持久化類的屬性的類型
cascade:設(shè)定是否級(jí)聯(lián)
lazy:設(shè)定是否延遲加載
<set>元素包含以下屬性:
name:設(shè)定映射的持久化類的屬性名
cascade:設(shè)置是否級(jí)聯(lián)
inverse:設(shè)定反向控制,如果為true則一的一端不維護(hù)外鍵
<key>:設(shè)定與所關(guān)聯(lián)的持久化類對(duì)應(yīng)的表的外鍵。
one-to-many:設(shè)定所關(guān)聯(lián)的持久化類
如果要對(duì)一對(duì)多關(guān)聯(lián)映射進(jìn)行級(jí)聯(lián)刪除,可以按照上面的舉例進(jìn)行配置:
首先看到一的一端:
<set name="quesion" inverse="true" cascade="delete">
<key column="question_type_name"/>
<one-to-many class="Question"/>
</set>
這里設(shè)置inverse表示一的一端不維護(hù)外鍵,設(shè)置cascade=”delete”表示刪除一的一端時(shí)對(duì)關(guān)聯(lián)到得多的所有的對(duì)象也一起刪除
再看到多的一端:
<many-to-one name="questionType" column="question_type_name"/>
這里的column表示外鍵的名,需要和一的一端設(shè)置的key標(biāo)簽里的column保持一致,表示維護(hù)同一個(gè)鍵值。
可以按照如下的代碼執(zhí)行刪除操作:
session.beginTransaction();
QuestionType questionType = (QuestionType) session.load(QuestionType.class, "判斷題");
session.delete(questionType);
session.getTransaction().commit();
這里使用load查上來(lái)的對(duì)象是持久狀態(tài)的(Persistent),只有是Persistent狀態(tài)的對(duì)象才可以使用session.delete()操作進(jìn)行級(jí)聯(lián)刪除,由new創(chuàng)建的對(duì)象屬于Transient狀態(tài),不能進(jìn)行session.delete()操作。
需要先刪子表,再刪除主表,否則報(bào)錯(cuò)
好文章
http://www.itzhai.com/hibernate-one-to-many-association-mapping-configuration-and-the-cascade-delete-problem.html
http://blog.csdn.net/itcareerist/article/details/5896143
http://www.cnblogs.com/xdp-gacl/p/4261895.html
http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/
http://blog.csdn.net/sweetsnow24/article/details/7447110
http://jingyan.baidu.com/article/b7001fe1738d9a0e7282dda6.html
http://wenku.baidu.com/link?url=YjPcc8q-E9jnAEqsEJQZ7juMw8TICa0q9ppU3ICqEyQJBl4JGQynegQT03DQA0oyA-CxGAtDKJ_pvuvo3prfVeLEsxzC7VUWjWMsQVAxht_
問(wèn)題1:XML是什么?
答:XML即可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup language),你可以根據(jù)自己的需要擴(kuò)展XML。XML中可以輕松定義
, 等自定義標(biāo)簽,而在HTML等其他標(biāo)記語(yǔ)言中必須使用預(yù)定義的標(biāo)簽,比如,而不能使用用戶定義的標(biāo)簽。使用DTD和XML Schema標(biāo)準(zhǔn)化XML結(jié)構(gòu)。XML主要用于從一個(gè)系統(tǒng)到另一系統(tǒng)的數(shù)據(jù)傳輸,比如企業(yè)級(jí)應(yīng)用的客戶端與服務(wù)端。
問(wèn)題2:DTD與XML Schema有什么區(qū)別?
答:DTD與XML Schema有以下區(qū)別:DTD不使用XML編寫而XML Schema本身就是xml文件,這意味著XML解析器等已有的XML工具可以用來(lái)處理XML Schema。而且XML Schema 是設(shè)計(jì)于DTD之后的,它提供了更多的類型來(lái)映射xml文件不同的數(shù)據(jù)類型。DTD即文檔類型描述(Document Type definition)是定義XML文件結(jié)構(gòu)的傳統(tǒng)方式。
問(wèn)題3:XPath是什么?
答:XPath是用于從XML文檔檢索元素的XML技術(shù)。XML文檔是結(jié)構(gòu)化的,因此XPath可以從XML文件定位和檢索元素、屬性或值。從數(shù)據(jù)檢索方面來(lái)說(shuō),XPath與SQL很相似,但是它有自己的語(yǔ)法和規(guī)則。
問(wèn)題4:XSLT是什么?
答:XSLT也是常用的XML技術(shù),用于將一個(gè)XML文件轉(zhuǎn)換為另一種XML,HTML或者其他的格式。XSLT為轉(zhuǎn)換XML文件詳細(xì)定義了自己的語(yǔ)法,函數(shù)和操作符。通常由XSLT引擎完成轉(zhuǎn)換,XSLT引擎讀取XSLT語(yǔ)法編寫的XML樣式表或者XSL文件的指令。XSLT大量使用遞歸來(lái)執(zhí)行轉(zhuǎn)換。一個(gè)常見XSLT使用就是將XML文件中的數(shù)據(jù)作為HTML頁(yè)面顯示。XSLT也可以很方便地把一種XML文件轉(zhuǎn)換為另一種XML文檔。
問(wèn)題5:什么是XML元素和屬性
答:最好舉個(gè)例子來(lái)解釋。下面是簡(jiǎn)單的XML片斷。
Xml代碼
6758.T
2300
例子中id是元素的一個(gè)屬性,其他元素都沒(méi)有屬性。
問(wèn)題6:什么是格式良好的XML
答:這個(gè)問(wèn)題經(jīng)常在電話面試中出現(xiàn)。一個(gè)格式良好的XML意味著該XML文檔語(yǔ)法上是正確的,比如它有一個(gè)根元素,所有的開放標(biāo)簽合適地閉合,屬性值必須加引號(hào)等等。如果一個(gè)XML不是格式良好的,那么它可能不能被各種XML解析器正確地處理和解析。
問(wèn)題7:XML命名空間是什么?它為什么很重要?
答:XML命名空間與Java的package類似,用來(lái)避免不同來(lái)源名稱相同的標(biāo)簽發(fā)生沖突。XML命名空間在XML文檔頂部使用xmlns屬性定義,語(yǔ)法為xmlns:prefix=’URI’。prefix與XML文檔中實(shí)際標(biāo)簽一起使用。下面例子為XML命名空間的使用。
Xml代碼
837363223
問(wèn)題8:DOM和SAX解析器有什么區(qū)別
答:這又是一道常見面試題,不僅出現(xiàn)在XML面試題中,在Java面試中也會(huì)問(wèn)到。DOM和SAX解析器的主要區(qū)別在于它們解析XML文檔的方式。使用DOM解析時(shí),XML文檔以樹形結(jié)構(gòu)的形式加載到內(nèi)存中,而SAX是事件驅(qū)動(dòng)的解析器。
問(wèn)題9:XML CDATA是什么
答:這道題很簡(jiǎn)單也很重要,但很多編程人員對(duì)它的了解并不深。CDATA是指字符數(shù)據(jù),它有特殊的指令被XML解析器解析。XML解析器解析XML文檔中所有的文本,比如This is name of person,標(biāo)簽的值也會(huì)被解析,因?yàn)闃?biāo)簽值也可能包含XML標(biāo)簽,比如First Name。CDATA部分不會(huì)被XML解析器解析。
問(wèn)題10:Java的XML數(shù)據(jù)綁定是什么
答:Java的XML綁定指從XML文件中創(chuàng)建類和對(duì)象,使用Java編程語(yǔ)言修改XML文檔。XML綁定的Java API,JAXB提供了綁定XML文檔和Java對(duì)象的便利方式。另一個(gè)可選的XML綁定方法是使用開源庫(kù),比如XML Beans。Java中XML綁定的一個(gè)最大的優(yōu)勢(shì)就是利用Java編程能力創(chuàng)建和修改XML文檔。
以上的XML面試問(wèn)答題收集自很多編程人員,但它們對(duì)于使用XML技術(shù)的每個(gè)人都是有用的。由于XML具有平臺(tái)獨(dú)立的特性,XPath,XSLT,XQuery等XML技術(shù)越來(lái)越重要。盡管XML有冗余和文檔體積大等缺點(diǎn),但它在web服務(wù)以及帶寬、速率作為次要考慮因素的系統(tǒng)間數(shù)據(jù)傳輸起很大作用,被廣泛用于跨平臺(tái)數(shù)據(jù)傳輸。
http://www.cnblogs.com/qanholas/p/3904833.html
SQL SERVER 理論上有32767個(gè)邏輯連接,SQL SERVER根據(jù)系統(tǒng)自行調(diào)配連接池。
首先 ,操作系統(tǒng)的用戶數(shù):即同時(shí)通過(guò)網(wǎng)絡(luò)連接到這臺(tái)電腦上面的用戶限制,以5用戶操作系統(tǒng),搭建的文件服務(wù)器為例,去同時(shí)訪問(wèn)這個(gè)文件服務(wù)器的網(wǎng)絡(luò)用戶為5個(gè)。
下面說(shuō)說(shuō)SQL server,購(gòu)買數(shù)據(jù)庫(kù)有兩種方式,1、根據(jù)用戶數(shù)購(gòu)買。2、根據(jù)cpu個(gè)數(shù)購(gòu)買。
根據(jù)用戶數(shù)購(gòu)買,假如你購(gòu)買了一個(gè)50用戶的數(shù)據(jù)庫(kù),那么可以通過(guò)網(wǎng)絡(luò)訪問(wèn)數(shù)據(jù)庫(kù)的人數(shù)限制為50。
根據(jù)cpu個(gè)數(shù)購(gòu)買的數(shù)據(jù)庫(kù)訪問(wèn)人數(shù)不受限制,服務(wù)器上面有幾顆cpu就要買幾個(gè)授權(quán)的SQL server,但是如果你只買一個(gè)授權(quán)的話數(shù)據(jù)庫(kù)也可以正常運(yùn)行,但是微軟認(rèn)為你的數(shù)據(jù)庫(kù)不合法。就如同盜版系統(tǒng)。
一個(gè)連接不等于一個(gè)用戶,單獨(dú)一個(gè)用戶可以有超過(guò)一個(gè)的連接,單獨(dú)一個(gè)連接可以有超過(guò)一個(gè)用戶。
你可以運(yùn)行里面輸入perfmon,然后加入下面兩個(gè)計(jì)數(shù)器進(jìn)行對(duì)比
SQLServer: General Statistics — Logical Connections:與系統(tǒng)建立的邏輯連接數(shù)。SQLServer: General Statistics — User Connections:連接到系統(tǒng)的用戶數(shù)。
打個(gè)比喻
sql server是你家的房子
用戶數(shù) 是你家房子鑰匙
連接數(shù) 是你家房子能進(jìn)去的人
不是很恰當(dāng),但是基本能說(shuō)明問(wèn)題
一個(gè)房子有多少個(gè)鑰匙是明確的,但是每個(gè)鑰匙是可以讓多個(gè)人進(jìn)去
也就是說(shuō),sql server的用戶是可以登陸sql server進(jìn)行操作的,而連接數(shù)指的是使用某個(gè)用戶名登陸的為了執(zhí)行某個(gè)具體操作的一個(gè)連接。
通常一個(gè)SQL SERVER 查詢器,一個(gè)ADOCONNECTION是一個(gè)連接。
在SQL Server里查看當(dāng)前連接的在線用戶數(shù)
use master
select loginame,count(0) from sysprocesses
group by loginame
order by count(0) desc
select nt_username,count(0) from sysprocesses
group by nt_username
order by count(0) desc
如果某個(gè)SQL Server用戶名test連接比較多,查看它來(lái)自的主機(jī)名:
select hostname,count(0) from sysprocesses where loginame='test'
group by hostname
order by count(0) desc
如果某個(gè)SQL Server用戶名test連接比較多,查看它最后一次操作的時(shí)間范圍分組:
select convert(varchar,last_batch,111),count(0) from sysprocesses where loginame='test'
group by convert(varchar,last_batch,111)
order by count(0) desc
如果從主機(jī)(www)來(lái)的連接比較多,可以查看它的進(jìn)程詳細(xì)情況
select * from??sysprocesses where hostname='www'
如果www機(jī)器主要提供網(wǎng)頁(yè)服務(wù),可能是asp程序處理連接時(shí)出了問(wèn)題, 生成殺這些進(jìn)程的SQL語(yǔ)句:
select 'kill '+convert(varchar,spid) from sysprocesses where hostname='www'
如果這樣的問(wèn)題頻繁出現(xiàn),可以寫一個(gè)存儲(chǔ)過(guò)程sp_KillIdleSpids.sql,
寫一個(gè)作業(yè), 執(zhí)行它, 來(lái)自動(dòng)殺掉從主機(jī)(www)來(lái)但已經(jīng)一天沒(méi)有響應(yīng)的用戶連接.
?
?
?
--------------------------------
SQL Server的用戶及權(quán)限?
?sysadmin 可以在 SQL Server 中執(zhí)行任何活動(dòng)?
serveradmin 可以設(shè)置服務(wù)器范圍的配置選項(xiàng) 關(guān)閉服務(wù)器?
setupadmin 可以管理鏈接服務(wù)器和啟動(dòng)過(guò)程?
securityadmin 可以管理登錄和 CREATE DATABASE 權(quán)限 還可以讀取錯(cuò)誤日志和更改密碼?
processadmin 可以管理在 SQL Server 中運(yùn)行的進(jìn)程?
dbcreator 可以創(chuàng)建 更改和除去數(shù)據(jù)庫(kù)?
diskadmin 可以管理磁盤文件?
bulkadmin 可以執(zhí)行 BULK INSERT 語(yǔ)句? ......
最大連接數(shù)是指數(shù)據(jù)庫(kù)能承受的最大并發(fā)訪問(wèn)數(shù)量
SQL Server的并發(fā)用戶數(shù)或者license怎么理解? 華軟論壇 2005-12-06 13:38:55 在 MS-SQL Server / 基礎(chǔ)類 提問(wèn)
盜版的有并發(fā)用戶數(shù)的限制嗎?正版好像有10用戶,50用戶的版本,如果用C/S架構(gòu)的話,每個(gè)客戶端連接算不算一個(gè)用戶?
后來(lái)有段時(shí)間好像改到 只按CPU購(gòu)買License了。現(xiàn)在又好像見到購(gòu)買連接數(shù)的license.
講了這么一堆,想告訴你的是,如果你只有10用戶的License,其實(shí)也是沒(méi)有限制的。這是微軟的市場(chǎng)人員親口告訴我的。 [華 軟 網(wǎng)]
歡迎轉(zhuǎn)載,但請(qǐng)保留出處,本文章轉(zhuǎn)自[華軟網(wǎng)] 原文鏈接:http://www.huarw.com/db/dbbbs/MSSQLServer/200512/735120.html
你指的是購(gòu)買許可吧?
SQL 提供3種購(gòu)買方式
1) Processor license. (按CPU購(gòu)買)
要求為運(yùn)行SQL Server 2000的操作系統(tǒng)上的每個(gè)CPU購(gòu)買許可. 這種方式不需要購(gòu)買客戶端訪問(wèn)許可.
2) Server plus device CALs. (服務(wù)器許可加每設(shè)備客戶端訪問(wèn)許可)
運(yùn)行SQL Server 2000的服務(wù)器需要一個(gè)許可, 每個(gè)訪問(wèn)SQL Server 2000的設(shè)備需要一個(gè)客戶端訪問(wèn)許可.
3) Server plus user CALs. (服務(wù)器許可加每用戶客戶端訪問(wèn)許可)
運(yùn)行SQL Server 2000的服務(wù)器需要一個(gè)許可, 每個(gè)訪問(wèn)SQL Server 2000的用戶需要一個(gè)客戶端訪問(wèn)許可
2、每客戶
每客戶授權(quán)模式要求每個(gè)將訪問(wèn) SQL Server 2000 服務(wù)器的設(shè)備都具有一個(gè)客戶端訪問(wèn)許可證。對(duì)于客戶端連接到不止一個(gè)服務(wù)器的網(wǎng)絡(luò),每客戶模式通常更劃算。
在編輯框中,選擇要授權(quán)的設(shè)備數(shù)。
選擇授權(quán)模式:
使用該對(duì)話框設(shè)置授權(quán)模式,以使客戶端可以訪問(wèn) Microsoft? SQL Server? 的該實(shí)例。SQL Server 2000 支持兩種客戶端訪問(wèn)授權(quán)模式,一個(gè)用于設(shè)備,另一個(gè)用于處理器。
設(shè)備可以是工作站、終端或運(yùn)行連接到 SQL Server 實(shí)例的 SQL Server 應(yīng)用程序的任何其它設(shè)備。
處理器指的是安裝在運(yùn)行 SQL Server 2000 實(shí)例的計(jì)算機(jī)上的中央處理器 (CPU)。一個(gè)計(jì)算機(jī)上可以安裝多個(gè)處理器,從而需要多個(gè)處理器許可證。
一旦設(shè)置了授權(quán)模式便無(wú)法再更改。可以在安裝 SQL Server 之后添加設(shè)備或處理器許可證,這使用 "控制面板 "中的 SQL Server 2000 授權(quán)安裝實(shí)用工具來(lái)進(jìn)行。
1、授權(quán)模式
當(dāng)從 "控制面板 "訪問(wèn)該對(duì)話框時(shí),安裝過(guò)程中選擇的模式在默認(rèn)情況下為選中,同時(shí)顯示以前選擇的設(shè)備數(shù)或處理器數(shù)。
2、每客戶
每客戶授權(quán)模式要求每個(gè)將訪問(wèn) SQL Server 2000 服務(wù)器的設(shè)備都具有一個(gè)客戶端訪問(wèn)許可證。對(duì)于客戶端連接到不止一個(gè)服務(wù)器的網(wǎng)絡(luò),每客戶模式通常更劃算。
在編輯框中,選擇要授權(quán)的設(shè)備數(shù)。
3、處理器許可證
使用處理器許可,安裝在運(yùn)行 SQL Server 的計(jì)算機(jī)上的每個(gè)處理器都需要一個(gè)許可證。處理器許可證允許任意數(shù)目的設(shè)備訪問(wèn)服務(wù)器,無(wú)論它們是通過(guò) Intranet 還是 Internet。
使用處理器許可,SQL Server 2000 可以利用每個(gè)安裝的處理器,并支持不限數(shù)目的客戶端設(shè)備。通過(guò) Internet 提供對(duì) SQL Server 數(shù)據(jù)庫(kù)的訪問(wèn)的客戶或擁有大量用戶的客戶通常選擇處理器許可證。
在編輯框中選擇要授權(quán)的處理器數(shù)。
SQL Server安裝成功后,重起計(jì)算機(jī)后SQL Server自動(dòng)啟動(dòng)服務(wù)。
10用戶不是指的連接用戶
在創(chuàng)建自定義控制臺(tái)時(shí),可以給控制臺(tái)指派兩種常用訪問(wèn)選項(xiàng)中的一種:作者模式或用戶模式。依次有三個(gè)級(jí)別的用戶模式,因此共有四種默認(rèn)訪問(wèn)控制臺(tái)的選項(xiàng):
作者模式
用戶模式-完全訪問(wèn)
用戶模式-受限訪問(wèn),多窗口
用戶模式-受限訪問(wèn),單窗口
你安裝的是企業(yè)版,10個(gè)客戶端是指你能夠在別的機(jī)子上只能安裝10個(gè)Sql客戶端同它連接
http://i-lolo.iteye.com/blog/1611562
在進(jìn)入網(wǎng)絡(luò)通信之前,讓我們來(lái)普及一點(diǎn)網(wǎng)絡(luò)基礎(chǔ)概念。如果你是有一定的計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ),請(qǐng)直接跳到第五點(diǎn)之后開始閱讀。
第一、 什么是計(jì)算機(jī)網(wǎng)絡(luò)?
書本上那些文縐縐的概念我們可以不去理,我告訴你,我們兩臺(tái)電腦連在一起就組成了一個(gè)計(jì)算機(jī)網(wǎng)絡(luò)。其實(shí)我們的電腦甚至是全世界的電腦都是連著的,只要你的電腦連著網(wǎng),你就在這個(gè)巨大的計(jì)算機(jī)網(wǎng)絡(luò)里,你也許會(huì)問(wèn)為什么我和他們是連著的啊?大家知道自己是怎么上的網(wǎng)?ADSL是吧,撥號(hào)上網(wǎng)。換個(gè)比方說(shuō)吧,我們?cè)诠疚覀兊碾娔X通過(guò)網(wǎng)線,雙絞線,然后是Hub(集線器),連接到胡哥的電腦,然后胡哥的機(jī)子通過(guò)撥號(hào),ADSL,連到電信的網(wǎng)關(guān)那兒,然后中國(guó)電信通過(guò)海底光纜和美國(guó)電信網(wǎng)關(guān)連接,然后再像剛剛我們連接中國(guó)電信一樣,逆推過(guò)去,連接到美國(guó)每一臺(tái)聯(lián)網(wǎng)的計(jì)算機(jī)。所以說(shuō)只要你連著網(wǎng),你就是和全世界的在線用戶連著。這是一個(gè)巨大的計(jì)算機(jī)網(wǎng)絡(luò)。非常巨大。
第二、 計(jì)算機(jī)網(wǎng)絡(luò)的主要功能?
資源共享、信息傳輸與集中處理、均衡負(fù)荷與分布處理、綜合信息服務(wù)(www/綜合數(shù)字網(wǎng)絡(luò) ISDN)。這些個(gè)功能,不多說(shuō)。這些你不平時(shí)都在用么?你的資源能夠上傳共享給其他人,有的人平時(shí)還很喜歡聊QQ,是吧,所以上面說(shuō)的這四個(gè)也許還有更多的什么功能都是些冠冕堂皇的話,稍微看下就好。用了自然就曉得了。
第三、 什么是網(wǎng)絡(luò)通信協(xié)議?
我來(lái)問(wèn)你,為什么你說(shuō)話身邊的人能夠聽的懂,別人說(shuō)的話你為什么也能夠聽懂,而為什么如果你去對(duì)一個(gè)外國(guó)人說(shuō)話或者一個(gè)外國(guó)人來(lái)和你說(shuō)話你們卻互相聽不懂呢?你會(huì)說(shuō)廢話嘛因?yàn)槲艺f(shuō)的是中文,是漢語(yǔ),中國(guó)人說(shuō)的都是漢語(yǔ),而外國(guó)人說(shuō)的是另一種語(yǔ)言,是外語(yǔ)。就是這樣,網(wǎng)絡(luò)通信協(xié)議就像我們的中文一樣,她就是我們之間的共同語(yǔ)言,他規(guī)定了我們之間怎么說(shuō)話,我先說(shuō)什么你再說(shuō)什么,你怎么說(shuō),而我應(yīng)該怎么聽。而網(wǎng)絡(luò)通信得先規(guī)定約定一些俗成的網(wǎng)絡(luò)通信協(xié)議,先說(shuō)好,兩臺(tái)計(jì)算機(jī)之間什么收發(fā)信息,信息格式是什么,信息怎么發(fā),怎么接收,而萬(wàn)一出錯(cuò)怎么辦怎么處理。沒(méi)有了這個(gè)協(xié)議,兩臺(tái)電腦就不知道互相之間怎么說(shuō)話,就像你對(duì)一頭大母豬說(shuō)完愛你,而人家根本就不知道你在說(shuō)什么。
在這兒和大家提一下網(wǎng)絡(luò)協(xié)議的分層思想。學(xué)過(guò)計(jì)算機(jī)網(wǎng)絡(luò)的同學(xué)都知道有兩種基本的國(guó)際標(biāo)準(zhǔn)分層模型,一個(gè)是OSI參考模型,一個(gè)是TCP/IP參考模型。OSI參考模型,是國(guó)際標(biāo)準(zhǔn)化組織搞出來(lái)的開放互聯(lián)傳統(tǒng)模型,一共有七層:物理/數(shù)據(jù)鏈路/網(wǎng)絡(luò)/傳輸/會(huì)話/表示/應(yīng)用。學(xué)網(wǎng)絡(luò)和硬件的一般都要熟悉這七層標(biāo)準(zhǔn),至于這七層都是干嘛的,大家自己?jiǎn)柖饶锘蛘咦约嚎搓P(guān)于網(wǎng)絡(luò)的書去。(中南大學(xué)高陽(yáng)教授主編了一本叫《計(jì)算機(jī)網(wǎng)絡(luò)原理與實(shí)用技術(shù)》的書,里邊很詳盡的介紹了這個(gè)OSI參考模型,沒(méi)記錯(cuò)的話應(yīng)該是在第一章1.4.5里,是放在TCP/IP協(xié)議之后的……)這里就不多說(shuō)了,因?yàn)閷?duì)于咱們編程的軟件人員來(lái)說(shuō),實(shí)際當(dāng)中的應(yīng)用,是分為四層,也就是TCP/IP參考模型。最底層物理+數(shù)據(jù)鏈路層/網(wǎng)絡(luò)層/傳輸層/應(yīng)用層。我們編的程序是位于應(yīng)用層,所以說(shuō),我們一直是在和哪一層打交道?TCP/IP層。我們編寫一個(gè)程序發(fā)送一些數(shù)據(jù),發(fā)給傳輸層,TCP/IP層,在這一層對(duì)數(shù)據(jù)進(jìn)行封裝,按照先前約定的協(xié)議,然后走向下一層,通過(guò)網(wǎng)線,再走到物理數(shù)據(jù)鏈路層,這時(shí)候數(shù)據(jù)就變成了一連串的01010101,到達(dá)對(duì)面之后逆推上面的過(guò)程,進(jìn)行解封,ok,信息發(fā)送完畢。這兒涉及到比較多的網(wǎng)絡(luò)底層,目前我們不需要過(guò)多了解,因?yàn)槲覀円龅墓ぷ鞑恍枰私鉅砍兜降竭@么底層的東西,如果你想深入了解或者今后你想做殺毒軟件什么的,去讀《TCP/IP詳解》。
第四、 IP——(Internet Protocol網(wǎng)絡(luò)之間互連的協(xié)議)?
你不用管其他的,你只需要知道IP這個(gè)東西給我們做出的最大貢獻(xiàn),就是給我們每一臺(tái)電腦提供了一個(gè)獨(dú)一無(wú)二的IP地址。你想我的機(jī)器要和你的機(jī)器交流說(shuō)話,我得知道你的機(jī)器叫什么,你的機(jī)器得有一個(gè)獨(dú)一無(wú)二的區(qū)別標(biāo)識(shí),否則的話我就不知道傳的信息有沒(méi)有傳到你那兒,也不知道這信息到底傳給誰(shuí)。IP地址這東西我們都知道吧?像我的本機(jī)IP: 113.240.187.242 這是湖南省長(zhǎng)沙市的IP。他是由四個(gè)字節(jié)組成的(也就是說(shuō)每一個(gè)值不能超過(guò)255)。(這個(gè)是IPV4,能夠組成將近四億多地址,現(xiàn)在已經(jīng)出來(lái)了IPV6,高檔貨,八個(gè)字節(jié),地址數(shù)是IPV4的幾何倍數(shù))IPV4的IP地址按照其網(wǎng)絡(luò)IP段和主機(jī)IP段占的字節(jié)數(shù)分ABC三類網(wǎng)。這個(gè)這里不說(shuō),大家自己去了解,好吧?拿高陽(yáng)教授的那本書翻翻。順帶看看子網(wǎng)掩碼啊網(wǎng)關(guān)啊什么的。自己去了解。在這兒我就累得給你敲了。
第五、 TCP協(xié)議和UDP協(xié)議?
好了,上一步里我們通過(guò)獨(dú)一無(wú)二的IP地址找到了對(duì)方連在了一起。我們可以通話了,關(guān)于通話我們有兩種方式:
第一、 TCP協(xié)議,什么叫TCP協(xié)議?Transmission Control Protocol 傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層(Transport layer)通信協(xié)議。什么叫可靠的?打個(gè)比方,我們打電話,上一步通過(guò)IP找到對(duì)方就相當(dāng)于撥號(hào)打通了你的電話,你拿起電話接了,我說(shuō)一句“喂?”,如果你這邊不回應(yīng),我就會(huì)杵這兒一直“喂”下去,是不?因?yàn)椴恢滥隳沁叺降捉拥搅寺牭搅宋业脑挍](méi)有,所以你這邊一定要告訴我你聽到了你收到了我剛剛的那句信息,我才會(huì)接著給你說(shuō)下面的話給你發(fā)下面的數(shù)據(jù)。我每發(fā)一次信息我要你給我確認(rèn)收到了,然后我再給你發(fā)接下來(lái)的東西,這個(gè)就叫可靠。在TCP/IP協(xié)議里邊這叫“三次握手”機(jī)制。怎么握手,握手是怎么回事,問(wèn)度娘,好吧?
第二、 UDP協(xié)議。User Datagram Protocol的簡(jiǎn)稱, 中文名是用戶數(shù)據(jù)報(bào)協(xié)議,是 OSI 參考模型中一種無(wú)連接的傳輸層協(xié)議。UDP這種方式相對(duì)于TCP來(lái)說(shuō)更加簡(jiǎn)單。UDP說(shuō)話就是,我給你說(shuō)一句話,你聽沒(méi)聽到我不管。就像發(fā)電報(bào),“黃河黃河我是長(zhǎng)江!”哐當(dāng)一下就發(fā)出去了。不管黃河收到?jīng)]有。兩種方式一種安全可靠但是慢,一種簡(jiǎn)單快捷但是不可靠。根據(jù)不同的需求選擇。像我們平時(shí)聊QQ開視頻啊什么的,用的就是UDP,因?yàn)槲覀儌鬏數(shù)倪@些個(gè)數(shù)據(jù)丟個(gè)一兩個(gè)包什么的無(wú)所謂,頂多就是視頻多了幾個(gè)馬賽克,是吧。那么平時(shí)我們玩的網(wǎng)絡(luò)游戲,像CF啊魔獸世界啊,是哪一種呢?自己想,好吧?
第三、 中南-馬志丹 http://java-mzd.javaeye.com 驚喜看得到!
基礎(chǔ)普及完了,接下來(lái)我們來(lái)看看為什么要去做網(wǎng)絡(luò)通信。這一段我就簡(jiǎn)單點(diǎn)說(shuō)。在計(jì)算機(jī)剛出來(lái)那會(huì)兒 ,那時(shí)候的人們都覺得計(jì)算機(jī)這東西就是主要為計(jì)算而存在的就是一個(gè)計(jì)算工具,但是自從1983年起,TCP\IP協(xié)議的出現(xiàn),讓計(jì)算機(jī)從此轉(zhuǎn)變?yōu)榱巳藗兊囊粋€(gè)交流工具。自那以后,只要你有一臺(tái)電腦,不管你是開網(wǎng)頁(yè)看電影,還是上人人找朋友,不管你是登郵箱收發(fā)郵件,還是登QQ聊天,你的生活的方方面面都離不開那電腦屏幕后邊的網(wǎng)絡(luò)技術(shù)。換句話說(shuō),如果沒(méi)有了網(wǎng)絡(luò)通信技術(shù),電腦以及大多數(shù)軟件將會(huì)失去他們?cè)械纳Α>拖褚豢么髽錄](méi)有根。沒(méi)有網(wǎng)絡(luò)通信就沒(méi)有如今繁榮的QQ世界,沒(méi)有了網(wǎng)絡(luò)通信,世界上那些個(gè)IT巨頭諸如IBM諸如谷歌,將會(huì)如斷線風(fēng)箏落日殘陽(yáng)。我想說(shuō),如果你不懂網(wǎng)絡(luò)通信技術(shù),你就不是一個(gè)合格的程序員,如果你不精通網(wǎng)絡(luò)通信技術(shù),你就無(wú)法開發(fā)出一款真正優(yōu)秀的營(yíng)運(yùn)軟件!除非你想永遠(yuǎn)停留在枯燥的單機(jī)時(shí)代,你想讓自己的技術(shù)永遠(yuǎn)留在表層。
現(xiàn)在,讓我們來(lái)考慮如何實(shí)現(xiàn)。
在做實(shí)現(xiàn)之前,我想先讓大家明白幾個(gè)概念:
1) Socket
A. 兩個(gè)Java應(yīng)用程序可通過(guò)一個(gè)雙向的網(wǎng)絡(luò)通信連接實(shí)現(xiàn)數(shù)據(jù)交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket
B. Socket通常用來(lái)實(shí)現(xiàn)client-server連接
C. Java.net包中定義的兩個(gè)類Socket和ServerSocket,分別用來(lái)實(shí)現(xiàn)雙向連接的client和server端
D. 建立連接時(shí)所需要的尋址信息為遠(yuǎn)程計(jì)算機(jī)的IP地址和端口號(hào)(Port number)
上面我們提到了IP地址,那是每一臺(tái)電腦獨(dú)一無(wú)二的一個(gè)地址標(biāo)識(shí),是為了對(duì)方計(jì)算機(jī)能夠找得到你給你發(fā)信息。建立連接我們很顯然需要這個(gè)信息才能夠完成。那么這個(gè)端口號(hào)又是用來(lái)干什么的呢?舉個(gè)例子,假如說(shuō)我電腦上現(xiàn)在上著人人和QQ,你的電腦上也是上著人人和QQ,如果我用QQ給你發(fā)一條消息他怎么知道就發(fā)到你的QQ上而不會(huì)在你的人人上呢?是吧?所以說(shuō)光用IP地址是無(wú)法區(qū)分到不同的應(yīng)用程序的。所以需要端口號(hào)來(lái)達(dá)到這個(gè)作用。端口號(hào)在計(jì)算機(jī)內(nèi)部是用兩個(gè)字節(jié)來(lái)表示,也就是說(shuō)總共有65536個(gè)端口。在這兒需要注意下面兩個(gè)點(diǎn):
?1.1024之前的端口我們自己編的程序不要征用它,因?yàn)檫@些端口是給系統(tǒng)用的。比如說(shuō)80端口,胡哥給咱們講過(guò)的。干嘛的?負(fù)責(zé)處理HTTP上網(wǎng)訪問(wèn)網(wǎng)頁(yè)等等的端口。還有就是21端口,F(xiàn)TP的,是吧?還有其他的一些著名端口,想知道問(wèn)度娘去,好吧?在這里就不羅嗦了。
?2.TCP端口和UDP端口是分開的,比如說(shuō)TCP有個(gè)8888端口,他和你的UDP8888端口是不一樣的。
?3.上述每一類有65536個(gè)端口。也就是說(shuō)我們的計(jì)算機(jī)能夠運(yùn)行131072個(gè)程序,只要你電腦吃得消。
既然要實(shí)現(xiàn)通信,那我們肯定要確定兩個(gè)通信對(duì)象,一個(gè)是服務(wù)器對(duì)象server,一個(gè)是客戶端對(duì)象client。我們需要知道,這兩個(gè)對(duì)象是兩個(gè)應(yīng)用程序,他們的對(duì)話,是兩個(gè)不同的程序之間的對(duì)話。你會(huì)說(shuō)我只有兩個(gè)對(duì)象也還沒(méi)法實(shí)現(xiàn)他們之間的交互啊,不用急,我也知道他們兩個(gè)不是神仙會(huì)心有靈犀。兩個(gè)對(duì)象之間想要實(shí)現(xiàn)互相之間的信息交互,就必須要有一個(gè)通道。這個(gè)通道就像是一根管子,一頭扎在服務(wù)器端,一頭插在客戶端。信息就在這根管子里來(lái)來(lái)往往。這根管子怎么插呢,插在哪兒呢?這個(gè)時(shí)候就需要用到剛剛提到的Socket了。
Socket的意思呢就是一個(gè)插座,服務(wù)器和客戶端各有一個(gè)插座,安插在各自的一個(gè)端口上,管子插在這兩個(gè)插座上,然后在他們這兩個(gè)端口上接入數(shù)據(jù)流。Socket通常用來(lái)實(shí)現(xiàn)server-client連接。Java里面有一個(gè)包java.net,他下邊有定義了兩個(gè)類,Socket和ServerSocket,分別用來(lái)實(shí)現(xiàn)雙向連接的server端和client端。
接下來(lái)我們來(lái)建立TCP服務(wù)器端和客戶端。
服務(wù)器端:我們用的是ServerSocket,新建一個(gè)server插座,并且交給他一個(gè)端口號(hào),這個(gè)插座他有一個(gè)非常方便的構(gòu)造方法ServerSocket(int port),讓他知道自己監(jiān)聽哪一個(gè)端口,然后新建一個(gè)socket對(duì)象,開機(jī),并用.accept語(yǔ)句讓他處在待機(jī)狀態(tài),等待接受client的接入。一旦有客戶端接入就將它賦給新建的Socket對(duì)象,并且用.getInputStream以及.getOutputStream命令獲得他的輸入輸出流。這個(gè)流,就是一根管子,信息都在這根管子里流通。這樣說(shuō)東西不怎么好說(shuō),那么我們就在這個(gè)流上面再包一層,將這個(gè)流封裝成DataOutputStream(),DataInputStream。然后就可以利用輸出流(這個(gè)是相對(duì)于服務(wù)器來(lái)說(shuō),這個(gè)輸出流到了客戶端就成了輸入流了)來(lái).write信息,利用輸入流來(lái).read()獲取客戶端發(fā)來(lái)的信息。Ok,接收完了,.close關(guān)閉輸入輸出流,以及關(guān)閉socket,關(guān)機(jī)。
客戶端:寫法和服務(wù)器端有點(diǎn)類似,新建一個(gè)插座,這兒需要留意的是,客戶端需要用到的插座是Socket而不是ServerSocket,新建一個(gè)Socket牌插座,同樣用他的Socket(String host,int port)構(gòu)造方法方法給他一個(gè)IP地址和端口號(hào),讓它撥打區(qū)號(hào)以及具體電話號(hào),這個(gè)和服務(wù)器端的IP地址以及端口號(hào)要一致,ok,這個(gè)時(shí)候server就相當(dāng)于申請(qǐng)連接到服務(wù)器的某一個(gè)端口上了。兩個(gè)程序就等于是連接上了。但是有些人就會(huì)問(wèn)了啊,這只是客戶端申請(qǐng)連接,人家服務(wù)器接不接受呢。好,前面我們的服務(wù)器不是提到了.accept么,這個(gè)方法就是用來(lái)接受客戶端的,這個(gè)時(shí)候就是:你申請(qǐng)連接,我接受連接,接下來(lái),照著上面服務(wù)器一樣,客戶端也獲取到自己的輸入輸出流,封裝,用輸出流寫出信息。咱們之間就可以互相通信了。還有一個(gè)問(wèn)題啊,要是如果有另一個(gè)客戶端接入了呢?簡(jiǎn)單,那就再.accept一下。如果有N多客戶端接入,那就不斷的.accept,不斷循環(huán)它。這個(gè)問(wèn)題大家都知道可以用while語(yǔ)句。
具體的敲法,請(qǐng)看我給大家附上的代碼實(shí)現(xiàn)。下面給大家看下Socket通信模型。看著這個(gè)模型,再回頭看看上面給大家嘮叨的那些個(gè)點(diǎn),我想大家都知道服務(wù)器和客戶端該怎么去寫怎么去實(shí)現(xiàn)通信了吧?
好了,這一段“三分鐘讓你看懂”到此就結(jié)束了,想來(lái)大家對(duì)網(wǎng)絡(luò)通信也該有了一個(gè)相對(duì)清晰的認(rèn)識(shí)。如果你還想了解學(xué)習(xí)更多的網(wǎng)絡(luò)通信方面的知識(shí),如果你還想知道如何去實(shí)現(xiàn)一些更多的通信功能,比如建立公共聊天室實(shí)現(xiàn)群聊,又比如建立一個(gè)以互聯(lián)網(wǎng)為基礎(chǔ)的以網(wǎng)絡(luò)畫板為主體的協(xié)助平臺(tái),又比如,你想做一個(gè)自己的軟件來(lái)實(shí)現(xiàn)像QQ一樣MSN一樣或者像人人桌面一樣的各種功能……請(qǐng)繼續(xù)關(guān)注我們的隨后更新。請(qǐng)記住,我們是ZCL,我們是一群簡(jiǎn)單快樂(lè)的牧碼人!
后記:第一篇正兒八經(jīng)的技術(shù)日志,4K多全手打,這樣說(shuō)起來(lái)應(yīng)該蠻自豪的感覺。但是說(shuō)實(shí)話還是覺得自己寫的有些亂。自己只是把課堂上老師們講的一些知識(shí)點(diǎn),根據(jù)自己敲的代碼以及做了的一些課堂筆記,羅列了出來(lái)。也查了一些在線資料和書籍,像度娘,像學(xué)校發(fā)的那本我都沒(méi)怎么動(dòng)過(guò)的《計(jì)算機(jī)網(wǎng)絡(luò)原理和實(shí)用技術(shù)》。在前面花了好些篇幅來(lái)講計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識(shí),是因?yàn)槲医o自己定下的目標(biāo)就是讓任何一個(gè)人甚至你是沒(méi)怎么學(xué)過(guò)接觸過(guò)java或者計(jì)算機(jī)網(wǎng)絡(luò)這一塊,看了我的博客之后,都能夠?qū)W(wǎng)絡(luò)通信有一個(gè)比較清晰的認(rèn)識(shí),而讓接觸過(guò)java的人知道怎么樣初步的去實(shí)現(xiàn)兩個(gè)軟件或者說(shuō)程序之間的通信,知道他們之間是怎么回事兒并且自己動(dòng)手實(shí)現(xiàn)它。這確實(shí)是一個(gè)有點(diǎn)難度的過(guò)程。但是你如果把這個(gè)都搞定了,那么,你的java網(wǎng)絡(luò)通信就基本可以說(shuō)入了一個(gè)門了。我似乎聽見了胡哥用他那一慣的口吻在我身后說(shuō),這種程度,要說(shuō)入門還早的很呢!當(dāng)然咯,就算我現(xiàn)在做到網(wǎng)絡(luò)畫圖板做到網(wǎng)絡(luò)文件傳輸,也感覺自己只是進(jìn)了一個(gè)門,門后的世界無(wú)比之大,等待我們不斷的去探索,去創(chuàng)新,去創(chuàng)造它。生命有限,學(xué)海無(wú)涯;人有老時(shí),學(xué)無(wú)止境嘛。發(fā)現(xiàn)的問(wèn)題蠻多。但獲得的收獲也不少。果然檢驗(yàn)自己是否學(xué)會(huì)掌握一個(gè)東西的最好辦法就是嘗試著去教給別人。只有你能夠很清晰的把事兒給別人說(shuō)清楚了教會(huì)了,你才能說(shuō)自己懂了。寫完這篇博客,感覺自己對(duì)網(wǎng)絡(luò)通信的理解又加深了一些,對(duì)其中的一些知識(shí)點(diǎn)的掌握也更加牢靠了一些。只言片語(yǔ)薄聞淺見,希望大家多多批評(píng)不吝賜教!
最后的最后:用胡哥的一句話來(lái)與君共勉吧!
標(biāo)準(zhǔn)即平庸,合格即廢物。
(附)服務(wù)器端代碼:
Java代碼 收藏代碼
package con120722;
import java.net.*;
import java.io.*;
public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss = new ServerSocket(10000);
while (true)
{
socket = ss.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
String line = in.readLine();
out.println("you input is :" + line);
out.close();
in.close();
socket.close();
}
}
catch (IOException e)
{}
}
public static void main(String[] args)
{
new Server();
}
}
客戶端代碼:
Java代碼 收藏代碼
package con120722;
Java代碼 收藏代碼
import java.io.*;
import java.net.*;
public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
socket = new Socket("localhost", 10000);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
out.println(line.readLine());
line.close();
out.close();
in.close();
socket.close();
}
catch (IOException e)
{}
}
public static void main(String[] args)
{
new Client();
}
}