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

Java多線程局域網(wǎng)聊天室的實現(xiàn)

 更新時間:2021年06月15日 14:31:19   作者:一只特立獨行的貓  
在學習了一個學期的java以后,搞了一個多線程的聊天室,熟悉了一下服務器和客戶機的操作。感興趣的小伙伴們可以參考一下

局域網(wǎng)聊天室

在學習了一個學期的java以后,覺得java真是博大精深,徹底放棄了因為c++而輕視java的心態(tài),搞了一個多線程的聊天室,熟悉了一下服務器和客戶機的操作。

1.TCP

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

address = InetAddress.getByName("192.168.43.86");

2.套接字

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

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

3.C/S架構

在這里插入圖片描述

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

4.多線程

由于服務器可能同時服務多個對象,若是采用傳統(tǒng)的方法進行服務器連接,則會出現(xiàn)多個客戶機等待一個客戶機與服務器交互的現(xiàn)象。為了解決這個問題,采用多線程的方法。
用SuperSocket類繼承socket類并實現(xiàn)Runnable接口,實現(xià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.服務器

服務器的架構第三部分所示,代碼實現(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);
        //實例化具有多線程功能的服務器專用socket類
        //需要傳遞端口號作為初始化變量
        SuperSocket socket_1 = new SuperSocket(9996);
        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);
        try {
            while(true) {
            	//開啟線程
                s1.start();
                s2.start();
                s3.start();
                if(scan.next()=="123"){
                //結束線程
                    break;
                }
            }
        } finally {
            try {
            //關閉套接字
                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 {
        //初始服務器型套接字
            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();
        }
    }
}

客戶端

客戶端的架構第三部分所示,代碼實現(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 {
            //得到本機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 {
            //關閉端口號,關閉io流
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

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

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

相關文章

  • Spring?Cloud?Loadbalancer服務均衡負載器詳解

    Spring?Cloud?Loadbalancer服務均衡負載器詳解

    這篇文章主要介紹了Spring?Cloud?Loadbalancer服務均衡負載器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設計方案

    基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設計方案

    這篇文章主要介紹了基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設計方案,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    這篇文章主要介紹了關于IDEA2020.1新建項目maven PKIX 報錯問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Mybatis中 XML配置詳解

    Mybatis中 XML配置詳解

    這篇文章主要介紹了Mybatis中 XML配置詳解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-01-01
  • Java處理延時任務的常用幾種解決方案

    Java處理延時任務的常用幾種解決方案

    本文主要介紹了Java處理延時任務的常用幾種解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • MybatisPlus字段類型轉換的實現(xiàn)示例

    MybatisPlus字段類型轉換的實現(xiàn)示例

    本文主要介紹了MybatisPlus如何完成字段類型轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • SpringBoot測試junit遇到的坑及解決

    SpringBoot測試junit遇到的坑及解決

    這篇文章主要介紹了SpringBoot測試junit遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?Valhalla?Project項目介紹

    Java?Valhalla?Project項目介紹

    這篇文章主要介紹了Java?Valhalla?Project項目介紹,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • SpringBoot Redis配置Fastjson進行序列化和反序列化實現(xiàn)

    SpringBoot Redis配置Fastjson進行序列化和反序列化實現(xiàn)

    這篇文章主要介紹了SpringBoot Redis配置Fastjson進行序列化和反序列化實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • SpringBoot如何指定某些類優(yōu)先啟動

    SpringBoot如何指定某些類優(yōu)先啟動

    這篇文章主要介紹了SpringBoot如何指定某些類優(yōu)先啟動,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論

望奎县| 宁明县| 白玉县| 梨树县| 延寿县| 永靖县| 鸡东县| 锡林浩特市| 秦安县| 涿州市| 武汉市| 松阳县| 惠州市| 瑞丽市| 荥阳市| 铁岭县| 静安区| 杂多县| 和政县| 驻马店市| 常州市| 关岭| 江华| 桑日县| 淮阳县| 宿松县| 遵化市| 南丹县| 涿鹿县| 登封市| 唐海县| 都昌县| 云龙县| 虞城县| 台北县| 稻城县| 荃湾区| 宁德市| 广汉市| 临洮县| 敖汉旗|