最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例

 更新時(shí)間:2021年07月06日 14:14:00   作者:一只特立獨(dú)行的貓  
這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

局域網(wǎng)聊天室

在學(xué)習(xí)了一個(gè)學(xué)期的java以后,覺得java真是博大精深,徹底放棄了因?yàn)閏++而輕視java的心態(tài),搞了一個(gè)多線程的聊天室,熟悉了一下服務(wù)器和客戶機(jī)的操作。

1.TCP

要實(shí)現(xiàn)局域網(wǎng)連接,就必須知道信息傳輸?shù)脑怼?br /> 在局域網(wǎng)里面?zhèn)鬏數(shù)男畔⒍际且园男问?,我使用的TCP包傳輸數(shù)據(jù),TCP包里面封裝了IP報(bào)文。
下面這句話就是通過一個(gè)靜態(tài)IPV4協(xié)議的類得到一個(gè)服務(wù)器的IP地址。

address = InetAddress.getByName("192.168.43.86");

2.套接字

在TCP中得到了服務(wù)器的IP地址,但是光憑IP地址無法對具體應(yīng)用進(jìn)行鎖定,所以引入了套接字這個(gè)概念。端口號用來鎖定主機(jī)的進(jìn)程。端口號一般取1024~49151,因?yàn)? ~ 1023是熟知端口號,一般用于一些HTTP等等常用的端口,49152 ~ 65535是臨時(shí)端口號,也不能隨機(jī)占用,一般是程序運(yùn)行過程中的臨時(shí)分配。
套接字=IP+端口號
這句話就是定義一個(gè)端口號9998和IP為192.168.43.86的套接字。

int port = 9998;
socket = new Socket(address,port);

3.C/S架構(gòu)

在這里插入圖片描述

從Java類的角度看,服務(wù)器和客戶端通過套接字連接抽象了一個(gè)連接。服務(wù)器通過建立自己的套接字端口并監(jiān)聽有無客戶在此端口連接,實(shí)現(xiàn)信息的讀取功能??蛻魴C(jī)通過服務(wù)器約定好的端口號,來對服務(wù)器進(jìn)行傳輸數(shù)據(jù)。在服務(wù)器開啟后,運(yùn)行客戶機(jī),將與服務(wù)器進(jìn)行三次握手建立TCP連接,然后在此連接的基礎(chǔ)上,實(shí)現(xiàn)客戶機(jī)與服務(wù)器的通信。

4.多線程

由于服務(wù)器可能同時(shí)服務(wù)多個(gè)對象,若是采用傳統(tǒng)的方法進(jìn)行服務(wù)器連接,則會出現(xiàn)多個(gè)客戶機(jī)等待一個(gè)客戶機(jī)與服務(wù)器交互的現(xiàn)象。為了解決這個(gè)問題,采用多線程的方法。
用SuperSocket類繼承socket類并實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)多線程運(yùn)行。

class SuperSocket extends Socket implements Runnable
SuperSocket socket_1 = new SuperSocket(9999);
SuperSocket socket_2 = new SuperSocket(9998);
SuperSocket socket_3 = new SuperSocket(9997);
Thread s1 = new Thread(socket_1);
Thread s2 = new Thread(socket_2);
Thread s3 = new Thread(socket_3);

5.服務(wù)器

服務(wù)器的架構(gòu)第三部分所示,代碼實(shí)現(xiàn)如下

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TCPserver2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //實(shí)例化具有多線程功能的服務(wù)器專用socket類
        //需要傳遞端口號作為初始化變量
        SuperSocket socket_1 = new SuperSocket(9996);
        SuperSocket socket_2 = new SuperSocket(9998);
        SuperSocket socket_3 = new SuperSocket(9997);
        //建立三個(gè)子線程
        Thread s1 = new Thread(socket_1);
        Thread s2 = new Thread(socket_2);
        Thread s3 = new Thread(socket_3);
        try {
            while(true) {
            	//開啟線程
                s1.start();
                s2.start();
                s3.start();
                if(scan.next()=="123"){
                //結(jié)束線程
                    break;
                }
            }
        } finally {
            try {
            //關(guān)閉套接字
                socket_1.close();
                socket_2.close();
                socket_3.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class SuperSocket extends Socket implements Runnable{

    InputStream is;
    byte[] buffer;
    Socket socket=null;
    ServerSocket serverSocket=null;

    public SuperSocket(int port){
        try {
        //初始服務(wù)器型套接字
            serverSocket = new ServerSocket(port);
            buffer = new byte[1024];

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        try {
        	//等待端口連接
            socket = serverSocket.accept();
            //連接完成后創(chuàng)建輸入流
            is = socket.getInputStream();
            //讀取客戶端傳送信息
            int len = is.read(buffer);
            String str = new String(buffer, 0, len);
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端

客戶端的架構(gòu)第三部分所示,代碼實(shí)現(xiàn)如下

package TCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TCPclient {
    public static void main(String[] args) {
        InetAddress address=null;
        Socket socket=null;
        OutputStream os=null;
        String message=null;
        Scanner sca=null;
        try {
            //得到本機(jī)IP地址
            address = InetAddress.getByName("192.168.43.86");
            //規(guī)定端口號,建立套接字
            int port = 9998;
            socket = new Socket(address,port);
            //綁定套接字的輸出流
            os = socket.getOutputStream();
            sca = new Scanner(System.in);
            while(true) {
                message = sca.next();
                //寫入輸出流,在局域網(wǎng)中傳輸
                os.write(message.getBytes());
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
            //關(guān)閉端口號,關(guān)閉io流
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

搞定,雖然特別簡陋,但是也能實(shí)現(xiàn)局域網(wǎng)類的通信。如果需要復(fù)制代碼的,記得改一下服務(wù)器的IP地址,IP地址可以在cmd下用ipconfig命令查看。打算期末考試完了以后再加上GUI并把這個(gè)功能加到具有alpha剪枝算法的AI六子棋對戰(zhàn)中去。

到此這篇關(guān)于Java創(chuàng)建多線程局域網(wǎng)聊天室實(shí)例的文章就介紹到這了,更多相關(guān)Java創(chuàng)建多線程聊天室內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從Mybatis-Plus開始認(rèn)識SerializedLambda的詳細(xì)過程

    從Mybatis-Plus開始認(rèn)識SerializedLambda的詳細(xì)過程

    這篇文章主要介紹了從Mybatis-Plus開始認(rèn)識SerializedLambda,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 了解Java線程池執(zhí)行原理

    了解Java線程池執(zhí)行原理

    那么有沒有一種辦法使得線程可以復(fù)用,就是執(zhí)行完一個(gè)任務(wù),并不被銷毀,而是可以繼續(xù)執(zhí)行其他的任務(wù)?在Java中可以通過線程池來達(dá)到這樣的效果。下面我們來詳細(xì)了解一下吧
    2019-05-05
  • SpringBoot3和mybatis-plus整合出現(xiàn)的問題解決辦法

    SpringBoot3和mybatis-plus整合出現(xiàn)的問題解決辦法

    SpringBoot和MybatisPlus的整合可以讓我們更加方便地進(jìn)行數(shù)據(jù)庫操作,這篇文章主要給大家介紹了關(guān)于SpringBoot3和mybatisplus整合出現(xiàn)的一些問題的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java 類加載過程與類加載器詳細(xì)介紹

    Java 類加載過程與類加載器詳細(xì)介紹

    這篇文章主要介紹了Java 類加載過程與類加載器詳細(xì)介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法

    spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法

    這篇文章主要介紹了spring中實(shí)現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java開發(fā)之Lombok指南

    Java開發(fā)之Lombok指南

    Lombok是一款Java開發(fā)插件,使得Java開發(fā)者可以通過其定義的一些注解來消除業(yè)務(wù)工程中冗長和繁瑣的代碼,它能夠在編譯源代碼期間自動幫我們生成這些方法,并沒有如反射那樣降低程序的性能。下面我們來詳細(xì)了解一下吧
    2019-06-06
  • Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

    Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

    這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Java中計(jì)算集合中元素的出現(xiàn)次數(shù)統(tǒng)計(jì)

    Java中計(jì)算集合中元素的出現(xiàn)次數(shù)統(tǒng)計(jì)

    本文主要介紹了Java中計(jì)算集合中元素的出現(xiàn)次數(shù)統(tǒng)計(jì),使用Collections類配合HashMap來統(tǒng)計(jì)和java lamb 計(jì)算這兩種方式,具有一定的參考價(jià)值,感興趣可以了解一下
    2024-02-02
  • SpringBoot的三大開發(fā)工具小結(jié)

    SpringBoot的三大開發(fā)工具小結(jié)

    本文主要介紹了SpringBoot的三大開發(fā)工具,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • IDEA運(yùn)行SpringBoot項(xiàng)目的超詳細(xì)步驟截圖

    IDEA運(yùn)行SpringBoot項(xiàng)目的超詳細(xì)步驟截圖

    在當(dāng)前的開發(fā)中Spring Boot開發(fā)框架已經(jīng)成為主流,下面這篇文章主要給大家介紹了關(guān)于IDEA運(yùn)行SpringBoot項(xiàng)目的超詳細(xì)步驟截圖,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評論

和林格尔县| 襄垣县| 敦化市| 石屏县| 沁水县| 凤阳县| 平塘县| 平原县| 建昌县| 丹巴县| 罗江县| 密云县| 裕民县| 潜山县| 双城市| 临颍县| 内江市| 鹿邑县| 刚察县| 昌平区| 措美县| 沐川县| 湖口县| 林甸县| 滦平县| 东源县| 新密市| 黔东| 芷江| 黔西县| 上虞市| 自治县| 通城县| 平陆县| 庆元县| 台山市| 嘉峪关市| 合阳县| 万盛区| 贵德县| 阿拉善盟|