在看到本文之前碘橘,如果讀者沒看過筆者的前文Java實(shí)現(xiàn)Socket網(wǎng)絡(luò)編程(二) ,請先翻閱吱肌。
下面痘拆,我們來實(shí)現(xiàn)服務(wù)器接收子線程:
// 信息接收流
BufferedReader brIn = null;
// 使用"GBK"編碼讀取中文
brIn = new BufferedReader(new InputStreamReader(
mSocket.getInputStream(), "GBK"));
for (int c = brIn.read(); c != -1; c = brIn.read()) {
ServerMain.jtaReceivedMessage.append((char) c + "");
// 滾動(dòng)到底端
ServerMain.jtaReceivedMessage
.setCaretPosition(ServerMain.jtaReceivedMessage
.getText().length());
}
Java輸入輸出,要采用流的方式氮墨,即InputStream和OutputStream纺蛆,筆者采用了”GBK“編碼讀取中文,當(dāng)然也可以采用”UTF-8“編碼规揪,在讀取信息過程中桥氏,邊讀取邊把內(nèi)容添加到可視區(qū)域(服務(wù)器接收框),并使接收框自動(dòng)滾動(dòng)猛铅,滑動(dòng)到最新的數(shù)據(jù)顯示位置字支。
值得注意的是,這個(gè)for循環(huán)是一個(gè)死循環(huán),除非發(fā)生讀寫錯(cuò)誤被捕獲到(Catch IOException)堕伪,否則循環(huán)不能結(jié)束揖庄。因此,不能把”接收到的信息添加到可視區(qū)域“這個(gè)步驟放置到for循環(huán)外欠雌,否則會(huì)導(dǎo)致”怎么讀取不到數(shù)據(jù)“這樣的問題而開發(fā)者又無法察覺蹄梢。如果要控制顯示格式,也要在for循環(huán)內(nèi)進(jìn)行或?qū)邮諗?shù)據(jù)本身進(jìn)行處理富俄。
接下來禁炒,我們實(shí)現(xiàn)服務(wù)器向客戶端”say hello“
OutputStreamWriter outstream = null;
// 將信息發(fā)送給客戶端
try {
outstream = new OutputStreamWriter(
clientSocket.getOutputStream(), "GBK");
outstream.write(message);
outstream.flush();
} catch (IOException e1) {
if (outstream != null)
outstream.close();
e1.printStackTrace();
}
在讀寫過程中,要采用相同的編碼霍比,這里筆者同樣采用”GBK“幕袱。使用OutputStream的flush()方法,這是為了避免使用緩沖區(qū)時(shí)悠瞬,當(dāng)輸出的數(shù)據(jù)大小小于緩沖區(qū)大小時(shí)们豌,系統(tǒng)不會(huì)進(jìn)行”等緩沖區(qū)滿再發(fā)送數(shù)據(jù)“的操作,而是直接把緩沖區(qū)的數(shù)據(jù)發(fā)送出去阁危,避免客戶端有”數(shù)據(jù)接收延時(shí)“的感覺。
在實(shí)現(xiàn)完服務(wù)器后汰瘫,客戶端也同樣要建立接收信息的線程狂打,并向服務(wù)器”say hello!“混弥,由于代碼類似趴乡,此處筆者為了節(jié)省篇幅,就不粘貼代碼蝗拿。