激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

2021-02-18 12:56大智若愚的小懂 JAVA教程

這篇文章主要介紹了Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼,具有一定參考價值,需要的朋友可以了解下。

java socket(套接字)通常也稱作"套接字",用于描述ip地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。

使用socket實現(xiàn)多個客戶端和同一客戶端通訊;首先客戶端連接服務(wù)端發(fā)送一條消息,服務(wù)端接收到消息后進行處理,完成后再回復(fù)客戶端一條消息。本人通過自己的思維編寫了一份服務(wù)端和客戶端實現(xiàn)的代碼,望能與大家相互學(xué)習(xí),共同進步。

服務(wù)端代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
 * socket服務(wù)端
 * 功能說明:
 *
 */
public class server {
    /**
   * 入口
   *
   * @param args
   * @throws ioexception
   */
    public static void main(string[] args) throws ioexception {
        // 為了簡單起見,所有的異常信息都往外拋
        int port = 8899;
        // 定義一個servicesocket監(jiān)聽在端口8899上
        serversocket server = new serversocket(port);
        system.out.println("等待與客戶端建立連接...");
        while (true) {
            // server嘗試接收其他socket的連接請求,server的accept方法是阻塞式的
            socket socket = server.accept();
            /**
       * 我們的服務(wù)端處理客戶端的連接請求是同步進行的, 每次接收到來自客戶端的連接請求后,
       * 都要先跟當(dāng)前的客戶端通信完之后才能再處理下一個連接請求。 這在并發(fā)比較多的情況下會嚴(yán)重影響程序的性能,
       * 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式
       */
            // 每接收到一個socket就建立一個新的線程來處理它
            new thread(new task(socket)).start();
        }
        // server.close();
    }
    /**
   * 處理socket請求的線程類
   */
    static class task implements runnable {
        private socket socket;
        /**
     * 構(gòu)造函數(shù)
     */
        public task(socket socket) {
            this.socket = socket;
        }
        @override
            public void run() {
            try {
                handlersocket();
            }
            catch (exception e) {
                e.printstacktrace();
            }
        }
        /**
     * 跟客戶端socket進行通信
     *
     * @throws ioexception
     */
        private void handlersocket() throws exception {
            // 跟客戶端建立好連接之后,我們就可以獲取socket的inputstream,并從中讀取客戶端發(fā)過來的信息了
            /**
       * 在從socket的inputstream中接收數(shù)據(jù)時,像上面那樣一點點的讀就太復(fù)雜了,
       * 有時候我們就會換成使用bufferedreader來一次讀一行
       *
       * bufferedreader的readline方法是一次讀一行的,這個方法是阻塞的,直到它讀到了一行數(shù)據(jù)為止程序才會繼續(xù)往下執(zhí)行,
       * 那么readline什么時候才會讀到一行呢?直到程序遇到了換行符或者是對應(yīng)流的結(jié)束符readline方法才會認(rèn)為讀到了一行,
       * 才會結(jié)束其阻塞,讓程序繼續(xù)往下執(zhí)行。
       * 所以我們在使用bufferedreader的readline讀取數(shù)據(jù)的時候一定要記得在對應(yīng)的輸出流里面一定要寫入換行符(
       * 流結(jié)束之后會自動標(biāo)記為結(jié)束,readline可以識別),寫入換行符之后一定記得如果輸出流不是馬上關(guān)閉的情況下記得flush一下,
       * 這樣數(shù)據(jù)才會真正的從緩沖區(qū)里面寫入。
       */
            bufferedreader br = new bufferedreader(
                      new inputstreamreader(socket.getinputstream(), "utf-8"));
            stringbuilder sb = new stringbuilder();
            string temp;
            int index;
            while ((temp = br.readline()) != null) {
                if ((index = temp.indexof("eof")) != -1) {
                    // 遇到eof時就結(jié)束接收
                    sb.append(temp.substring(0, index));
                    break;
                }
                sb.append(temp);
            }
            system.out.println("form cliect[port:" + socket.getport()
                      + "] 消息內(nèi)容:" + sb.tostring());
            // 回應(yīng)一下客戶端
            writer writer = new outputstreamwriter(socket.getoutputstream(),
                      "utf-8");
            writer.write(string.format("hi,%d.天朗氣清,惠風(fēng)和暢!", socket.getport()));
            writer.flush();
            writer.close();
            system.out.println(
                      "to cliect[port:" + socket.getport() + "] 回復(fù)客戶端的消息發(fā)送成功");
            br.close();
            socket.close();
        }
    }
}

客戶端代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.io.inputstreamreader;
import java.io.outputstreamwriter;
import java.io.reader;
import java.io.writer;
import java.net.socket;
/** * socket客戶端
* 功能說明: * * @author 大智若愚的小懂 * @date 2016年8月30日 * @version 1.0 */
public class client {
    /** * 入口 * @param args */
    public static void main(string[] args) {
        // 開啟三個客戶端,一個線程代表一個客戶端
        for (int i = 0; i < 3; i++) {
            new thread(new runnable() {
                @override public void run() {
                    try {
                        testclient client = testclientfactory.createclient();
                        client.send(string.format("hello,server!i'm %d.這周末天氣如何。", client.client.getlocalport()));
                        client.receive();
                    }
                    catch (exception e) {
                        e.printstacktrace();
                    }
                }
            }
            ).start();
        }
    }
    /** * 生產(chǎn)測試客戶端的工廠 */
    static class testclientfactory {
        public static testclient createclient() throws exception {
            return new testclient("127.0.0.1", 8899);
        }
    }
    /** * 測試客戶端 */
    static class testclient {
        /** * 構(gòu)造函數(shù) * @param host 要連接的服務(wù)端ip地址 * @param port 要連接的服務(wù)端對應(yīng)的監(jiān)聽端口 * @throws exception */
        public testclient(string host, int port) throws exception {
            // 與服務(wù)端建立連接
            this.client = new socket(host, port);
            system.out.println("cliect[port:" + client.getlocalport() + "] 與服務(wù)端建立連接...");
        }
        private socket client;
        private writer writer;
        /** * 發(fā)送消息 * @param msg * @throws exception */
        public void send(string msg) throws exception {
            // 建立連接后就可以往服務(wù)端寫數(shù)據(jù)了
            if(writer == null) {
                writer = new outputstreamwriter(client.getoutputstream(), "utf-8");
            }
            writer.write(msg);
            writer.write("eof\n");
            writer.flush();
            // 寫完后要記得flush
            system.out.println("cliect[port:" + client.getlocalport() + "] 消息發(fā)送成功");
        }
        /** * 接收消息 * @throws exception */
        public void receive() throws exception {
            // 寫完以后進行讀操作
            reader reader = new inputstreamreader(client.getinputstream(), "utf-8");
            // 設(shè)置接收數(shù)據(jù)超時間為10秒
            client.setsotimeout(10*1000);
            char[] chars = new char[64];
            int len;
            stringbuilder sb = new stringbuilder();
            while ((len = reader.read(chars)) != -1) {
                sb.append(new string(chars, 0, len));
            }
            system.out.println("cliect[port:" + client.getlocalport() + "] 消息收到了,內(nèi)容:" + sb.tostring());
            reader.close();
            // 關(guān)閉連接
            writer.close();
            client.close();
        }
    }
}

接下來模擬一下:

1.首先運行服務(wù)端

Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

2.接著運行客戶端(開三個客戶端請求)

為了演示有所區(qū)分,服務(wù)端我使用的是eclipse工具,客戶端使用的是intellij idea工具。這時可以看到客戶端在控制臺打印出來的消息

Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

一個port端口號代表一個客戶端,回過來看下服務(wù)端在控制臺打印出來的消息

Java編程Socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼

總結(jié)

以上就是本文關(guān)于java編程socket實現(xiàn)多個客戶端連接同一個服務(wù)端代碼的全部內(nèi)容,希望對大家有所幫助。有問題可以留言,小編會及時回復(fù)大家的。

原文鏈接:https://www.2cto.com/kf/201609/543865.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产亚洲精品 | 精品视频一区二区三区四区 | 看个毛片| 亚洲亚色 | 麻豆视频在线观看 | 成人一级视频在线观看 | 国产xxxx免费 | 极品大长腿啪啪高潮露脸 | 久久久久久久免费看 | 久久免费视频5 | av在线成人 | 九九精品在线播放 | 极品销魂一区二区三区 | 超碰97最新 | av在线免费观看中文字幕 | 欧美一级片一区 | 午夜偷拍视频 | 92看片淫黄大片欧美看国产片 | 午夜神马福利视频 | 久久2019中文字幕 | 成人午夜在线免费视频 | 凹凸成人精品亚洲精品密奴 | 久久久久久久亚洲精品 | 日本aaa一级片 | 久青草免费视频 | 国产精品视频在 | 毛片在线免费播放 | 一边吃奶一边摸下娇喘 | 国产美女视频黄a视频免费 日韩黄色在线播放 | 国产亚洲精品久久久久久网站 | 中文字幕欧美在线 | 国产精品久久久久无码av | 国产一级淫 | free japan xxxxhdsex69| 国产午夜精品一区二区三区不卡 | 中文字幕激情视频 | 亚洲电影免费观看国语版 | 美国黄色毛片女人性生活片 | 草久影院| 一级做a爱片毛片免费 | 国产在线一区二区三区 |