Socket異步讀寫 線程實(shí)現(xiàn)

保證socket客戶端實(shí)例同步

啟動(dòng)客戶端連接? 并啟動(dòng) 輸入流線程 同時(shí)保證socket客戶端實(shí)例同步

讀線程獲取當(dāng)前客戶端的 輸入流

循環(huán)讀取

上代碼

服務(wù)端:

package com.my.socket.server;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

public class SocketServer {

? ? private static int port=8888;

? ? private static int index = 1;

? ? public SocketServer(int port) {

? ? ? ? this.port = port;

? ? }

? ? public static void main(String[] args) {

? ? ? ? try {

? ? ? ? ? ? /**

? ? ? ? ? ? * 創(chuàng)建 socket 服務(wù) 并監(jiān)聽

? ? ? ? ? ? */

? ? ? ? ? ? ServerSocket server = new ServerSocket(port);

? ? ? ? ? ? System.out.println("成功啟動(dòng)服務(wù)端,等待客戶端連接袒炉。乍钻。白对。。");

? ? ? ? ? ? while (true) {

? ? ? ? ? ? ? ? // 監(jiān)聽客戶連接 如果有連接 放入一個(gè)新的線程當(dāng)中

? ? ? ? ? ? ? ? Socket? client = server.accept();

? ? ? ? ? ? ? ? System.out.println(index+"號(hào)客戶端連接成功");

? ? ? ? ? ? ? ? // 開始線程

? ? ? ? ? ? ? ? Thread clientThread = new Thread(new SocketServerRunnable(client, index + "號(hào)客戶端"));

? ? ? ? ? ? ? ? clientThread.start();

? ? ? ? ? ? ? ? index++;

? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

}

package com.my.socket.server;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

/**

* @author zhanghaotian

*

*/

public class SocketServerRunnable implements Runnable {

? ? private volatile Socket client = null;

? ? private volatile String name;

? ? public SocketServerRunnable(Socket client, String name) {

? ? ? ? this.client = client;

? ? ? ? this.name = name;

? ? }

? ? @Override

? ? public void run() {

? ? ? ? try {

? ? ? ? ? ? DataOutputStream dos = new DataOutputStream(this.client.getOutputStream());

? ? ? ? ? ? DataInputStream dis = new DataInputStream(this.client.getInputStream());

? ? ? ? ? ? while (true) {

? ? ? ? ? ? ? ? if (client.isClosed())

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? String utf = dis.readUTF();

? ? ? ? ? ? ? ? dos.writeUTF("服務(wù)器消息:接收數(shù)據(jù)" + this.name + "并返回垄潮。" + utf);

? ? ? ? ? ? ? ? dos.flush();

? ? ? ? ? ? }

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? return;

? ? ? ? }

? ? }

}

客戶端:

package com.my.socket.client;

/**

*? 可以 啟動(dòng)? 多個(gè) 客戶端 測(cè)試? 可以多線程讀取

* @author zhanghaotian

*

*/

public class SocketClient {

? ? public static void main(String[] args) throws Exception {

? ? ? ? ? ? new Thread(new SocketClientRunnable()).start();

? ? }

}

package com.my.socket.client;

import java.io.DataInputStream;

import java.io.IOException;

/**

* 持續(xù)讀取服務(wù)端數(shù)據(jù)

*

* @author zhanghaotian

*

*/

public class SocketClientReadIO implements Runnable {

? ? private volatile DataInputStream dis = null;

? ? private volatile int index = 0;

? ? public? SocketClientReadIO(DataInputStream dis) {

? ? ? ? this.dis = dis;

? ? }

? ? @Override

? ? public void run() {

? ? ? ? while (true) {

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? System.out.println("我是讀取線程:"+dis.readUTF());

? ? ? ? ? ? ? ? index++;

? ? ? ? ? ? ? ? //放慢讀取的速度 看看會(huì)出現(xiàn)什么樣的后果

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? Thread.sleep(2000);

? ? ? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block

? ? ? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } catch (IOException e) {

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return;

? ? }

}

package com.my.socket.client;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import javax.swing.plaf.SliderUI;

public class SocketClientRunnable implements Runnable {

? ? @Override

? ? public void run() {

? ? ? ? try {

? ? ? ? ? ? // 連接服務(wù)端

? ? ? ? ? ? Socket client = new Socket("127.0.0.1", 8888);

? ? ? ? ? ? // 啟動(dòng)讀取線程

? ? ? ? ? ? new Thread(new SocketClientReadIO(new DataInputStream(client.getInputStream()))).start();

? ? ? ? ? ? DataOutputStream dos = new DataOutputStream(client.getOutputStream()); // 獲取輸出流

? ? ? ? ? ? int index = 0;

? ? ? ? ? ? while (index < 100) {

? ? ? ? ? ? ? ? index++;

? ? ? ? ? ? ? ? // 輸出信息到服務(wù)端

? ? ? ? ? ? ? ? dos.writeUTF("你好服務(wù)端!" + index);

? ? ? ? ? ? ? ? dos.flush();

? ? ? ? ? ? }

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? System.out.println("向服務(wù)端寫入數(shù)據(jù)完畢 寫入數(shù)據(jù)數(shù)量:" + index+"線程等待中....");

? ? ? ? ? ? ? ? Thread.sleep(10000000);

? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? // TODO Auto-generated catch block

? ? ? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? }


? ? ? ? } catch (IOException e) {

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怕磨,隨后出現(xiàn)的幾起案子喂饥,更是在濱河造成了極大的恐慌,老刑警劉巖肠鲫,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件员帮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡导饲,警方通過查閱死者的電腦和手機(jī)捞高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渣锦,“玉大人硝岗,你說我怎么就攤上這事〈校” “怎么了型檀?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長听盖。 經(jīng)常有香客問我胀溺,道長,這世上最難降的妖魔是什么皆看? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任月幌,我火速辦了婚禮,結(jié)果婚禮上悬蔽,老公的妹妹穿的比我還像新娘扯躺。我一直安慰自己,他們只是感情好蝎困,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布录语。 她就那樣靜靜地躺著,像睡著了一般禾乘。 火紅的嫁衣襯著肌膚如雪澎埠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天始藕,我揣著相機(jī)與錄音蒲稳,去河邊找鬼。 笑死伍派,一個(gè)胖子當(dāng)著我的面吹牛江耀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诉植,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼祥国,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舌稀,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤啊犬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后壁查,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觉至,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年睡腿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了语御。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫉到,死狀恐怖沃暗,靈堂內(nèi)的尸體忽然破棺而出月洛,到底是詐尸還是另有隱情何恶,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布嚼黔,位于F島的核電站细层,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唬涧。R本人自食惡果不足惜疫赎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎节。 院中可真熱鬧捧搞,春花似錦、人聲如沸狮荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殖氏。三九已至晚树,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雅采,已是汗流浹背爵憎。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婚瓜,地道東北人宝鼓。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像巴刻,于是被迫代替她去往敵國和親席函。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容