Java實現(xiàn)Socket網(wǎng)絡(luò)編程(二)

在看到本文之前馋劈,如果讀者沒看過筆者的前文Java實現(xiàn)Socket網(wǎng)絡(luò)編程(一) ,請先翻閱偶洋。在閱讀本文前熟吏,讀者應(yīng)先具備Java的Swing編程的基礎(chǔ)知識。

首先玄窝,我們編寫服務(wù)器的界面:

        JFrame mainFrame = new ServerMain();
        mainFrame.setTitle("server");
        mainFrame.setSize(545, 395);
        // 設(shè)置顯示位置為正中間
        mainFrame.setLocationRelativeTo(null);
        // 設(shè)置布局文件為空牵寺,以讓組件可使用絕對布局setBounds
        mainFrame.setLayout(null);
        // 大小不可變
        mainFrame.setResizable(false);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setVisible(true);
        // 設(shè)置IPAddress標(biāo)簽
        JLabel jlIP = new JLabel("IPAddress:");
        jlIP.setBounds(10, 15, 70, 25);
        add(jlIP);

        // 設(shè)置IPAddress顯示文本
        JTextField jtfIP = new JTextField();
        jtfIP.setText("127.0.0.1");
        jtfIP.setEditable(false);
        jtfIP.setBounds(80, 15, 185, 25);
        jtfIP.setText(Common.IP);
        add(jtfIP);

        // 設(shè)置Port標(biāo)簽
        JLabel jlPort = new JLabel("Port:");
        jlPort.setBounds(10, 50, 70, 25);
        add(jlPort);

        // 設(shè)置Port顯示文本
        JTextField jtfPort = new JTextField();
        jtfPort.setText("10055");
        jtfPort.setEditable(false);
        jtfPort.setBounds(80, 50, 185, 25);
        jtfPort.setText(Common.PORT + "");
        add(jtfPort);

        // 設(shè)置Client標(biāo)簽
        JLabel jlClient = new JLabel("Choose Client:");
        jlClient.setBounds(15, 90, 100, 25);
        add(jlClient);

        // 創(chuàng)建Client列表
        model = new DefaultListModel<>();
        clientList = new JList<String>(model);
        clientList.setBorder(BorderFactory.createLineBorder(Color.black));
        // 設(shè)置多選模式
        clientList
                .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        clientList.setFocusable(true);

        // 添加滾動
        jpclientList = new JScrollPane(clientList);
        jpclientList.setBounds(10, 115, 255, 65);
        add(jpclientList);

        // 設(shè)置Send Message標(biāo)簽
        JLabel jlSendMessage = new JLabel("Send Message:");
        jlSendMessage.setBounds(15, 185, 100, 25);
        add(jlSendMessage);

        // 設(shè)置Send Message文本
        jtaSendMessage = new JTextArea();
        // 激活自動換行功能
        jtaSendMessage.setLineWrap(true);
        // 激活斷行不斷字功能
        jtaSendMessage.setWrapStyleWord(true);
        // 設(shè)置黑色邊框
        jtaSendMessage.setBorder(BorderFactory.createLineBorder(Color.black));
        // 添加滾動條
        JScrollPane jpSendMessage = new JScrollPane(jtaSendMessage);
        jpSendMessage.setBounds(10, 210, 255, 100);
        add(jpSendMessage);

        // 設(shè)置Connect標(biāo)簽
        jlConnect = new JLabel("0 Connect success.");
        jlConnect.setBounds(15, 320, 130, 25);
        add(jlConnect);

        // 設(shè)置Send Message按鈕
        JButton jbSendMessage = new JButton("SendMessage");
        jbSendMessage.setBounds(145, 320, 120, 25);

        add(jbSendMessage);

        // 設(shè)置Received Message標(biāo)簽
        JLabel jlReceivedMessage = new JLabel("Received Message:");
        jlReceivedMessage.setBounds(295, 15, 130, 25);
        add(jlReceivedMessage);

        // 設(shè)置Received Message文本
        jtaReceivedMessage = new JTextArea();
        // 激活自動換行功能
        jtaReceivedMessage.setLineWrap(true);
        // 激活斷行不斷字功能
        jtaReceivedMessage.setWrapStyleWord(true);
        // 設(shè)置不可編輯
        jtaReceivedMessage.setEditable(false);
        // 設(shè)置黑色邊框
        jtaReceivedMessage.setBorder(BorderFactory
                .createLineBorder(Color.black));
        // 添加滾動條
        JScrollPane jpReceivedMessage = new JScrollPane(jtaReceivedMessage);
        jpReceivedMessage.setBounds(285, 40, 230, 305);
        add(jpReceivedMessage);

然后,我們編寫客戶端界面:因客戶端界面和服務(wù)器界面大體相似恩脂,筆者在此處就不粘貼代碼了帽氓。值得注意的是,客戶端和服務(wù)器應(yīng)是兩個不同的Java Project俩块。

根據(jù)設(shè)計思路黎休,我們?yōu)榉?wù)器創(chuàng)建一個ServerSocket,監(jiān)聽4703端口玉凯,并啟動一個主監(jiān)聽線程势腮,監(jiān)測是否有客戶端連接。

        try {
            // 創(chuàng)建監(jiān)聽4703端口的ServerSocket
            serverSocket = new ServerSocket(Common.PORT);

            // 啟動一個監(jiān)聽線程
            listenThread = new Thread(new ListenThread());
            listenThread.start();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

實際上漫仆,可采用大于1024的任意端口捎拯,筆者選用4703端口,是因為此端口很少被占用盲厌,能在不同的機(jī)器上運行時不會產(chǎn)生端口沖突署照。小于1024的端口都是綁定給特定的服務(wù),所以一般除了那些專門提供某服務(wù)的軟件可以用吗浩,別的軟件一般不用建芙。

下面,我們來實現(xiàn)服務(wù)器主監(jiān)聽線程ListenThread:

        // 響應(yīng)一個請求
        Socket clientSocket = ServerMain.serverSocket.accept();

        // 創(chuàng)建一個子線程和客戶端保持連接
        new Thread(new ServerReceiverThread(clientSocket)).start();

        // 添加到Socket請求隊列
        HashMap<Socket, Boolean> map = new HashMap<Socket, Boolean>();
        map.put(clientSocket, false);
        clientSockets.add(map);

通過ServerSocket的accept()方法拓萌,去響應(yīng)一個連接請求岁钓,并創(chuàng)建一個與客戶端交互的Socket對象,把Socket對象添加到請求隊列微王,為后期發(fā)送消息做準(zhǔn)備屡限。同時創(chuàng)建一個子線程,用于接收客戶端消息炕倘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钧大,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罩旋,更是在濱河造成了極大的恐慌啊央,老刑警劉巖眶诈,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓜饥,居然都是意外死亡逝撬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門乓土,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪潮,“玉大人,你說我怎么就攤上這事趣苏〗葡啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵食磕,是天一觀的道長尽棕。 經(jīng)常有香客問我,道長彬伦,這世上最難降的妖魔是什么滔悉? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮媚朦,結(jié)果婚禮上氧敢,老公的妹妹穿的比我還像新娘日戈。我一直安慰自己询张,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布浙炼。 她就那樣靜靜地躺著份氧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弯屈。 梳的紋絲不亂的頭發(fā)上蜗帜,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音资厉,去河邊找鬼厅缺。 笑死,一個胖子當(dāng)著我的面吹牛宴偿,可吹牛的內(nèi)容都是我干的湘捎。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼窄刘,長吁一口氣:“原來是場噩夢啊……” “哼窥妇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娩践,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤活翩,失蹤者是張志新(化名)和其女友劉穎烹骨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體材泄,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡沮焕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拉宗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遇汞。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖簿废,靈堂內(nèi)的尸體忽然破棺而出空入,到底是詐尸還是另有隱情,我是刑警寧澤族檬,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布歪赢,位于F島的核電站,受9級特大地震影響单料,放射性物質(zhì)發(fā)生泄漏埋凯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一扫尖、第九天 我趴在偏房一處隱蔽的房頂上張望白对。 院中可真熱鬧,春花似錦换怖、人聲如沸甩恼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽条摸。三九已至,卻和暖如春铸屉,著一層夾襖步出監(jiān)牢的瞬間钉蒲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工彻坛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留顷啼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓昌屉,卻偏偏與公主長得像钙蒙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怠益,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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