溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-06-15 15:15:57 來(lái)源:億速云 閱讀:164 作者:chen 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“利用Java實(shí)現(xiàn)多線程局域網(wǎng)聊天室”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.TCP

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

address = InetAddress.getByName("192.168.43.86");

2.套接字

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

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

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

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

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

4.多線程

由于服務(wù)器可能同時(shí)服務(wù)多個(gè)對(duì)象,若是采用傳統(tǒng)的方法進(jìn)行服務(wù)器連接,則會(huì)出現(xiàn)多個(gè)客戶機(jī)等待一個(gè)客戶機(jī)與服務(wù)器交互的現(xiàn)象。為了解決這個(gè)問(wèn)題,采用多線程的方法。
用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類
        //需要傳遞端口號(hào)作為初始化變量
        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) {
            	//開(kāi)啟線程
                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ī)定端口號(hào),建立套接字
            int port = 9998;
            socket = new Socket(address,port);
            //綁定套接字的輸出流
            os = socket.getOutputStream();
            sca = new Scanner(System.in);
            while(true) {
                message = sca.next();
                //寫(xiě)入輸出流,在局域網(wǎng)中傳輸
                os.write(message.getBytes());
            }

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

“利用Java實(shí)現(xiàn)多線程局域網(wǎng)聊天室”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI