Maison >Java >javaDidacticiel >Comment créer une salle de discussion LAN multithread en Java

Comment créer une salle de discussion LAN multithread en Java

王林
王林avant
2023-05-09 12:34:141416parcourir

1.TCP

Pour réaliser une connexion LAN, vous devez connaître le principe de transmission des informations.
Les informations transmises dans le LAN se présentent sous forme de paquets. J'utilise des paquets TCP pour transmettre des données, et les paquets IP sont encapsulés dans les paquets TCP.
La phrase suivante consiste à obtenir l'adresse IP d'un serveur via une classe de protocole IPV4 statique.

address = InetAddress.getByName("192.168.43.86");

2. Socket

a obtenu l'adresse IP du serveur en TCP, mais l'adresse IP seule ne peut pas verrouiller une application spécifique, c'est pourquoi le concept de sockets a été introduit. Le numéro de port est utilisé pour verrouiller le processus de l'hôte. Les numéros de port sont généralement 1024~49151, car 0~1023 sont des numéros de port bien connus et sont généralement utilisés pour certains ports couramment utilisés tels que HTTP. 49152~65535 sont des numéros de port temporaires et ne peuvent pas être occupés de manière aléatoire. Ils sont généralement temporairement alloués. le déroulement du programme.
Socket = IP + numéro de port
Cette phrase définit un socket avec le numéro de port 9998 et IP 192.168.43.86.

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

Architecture 3.C/S

Comment créer une salle de discussion LAN multithread en Java

Du point de vue des classes Java, le serveur et le client résument une connexion via des connexions socket. Le serveur réalise la fonction de lecture des informations en établissant son propre port socket et en surveillant si un client se connecte à ce port. Le client transmet les données au serveur via le numéro de port convenu par le serveur. Une fois le serveur allumé, exécutez le client et effectuez une négociation à trois avec le serveur pour établir une connexion TCP. Ensuite, sur la base de cette connexion, la communication entre le client et le serveur est réalisée.

4. Multi-threading

Étant donné que le serveur peut servir plusieurs objets en même temps, si la méthode traditionnelle est utilisée pour la connexion au serveur, plusieurs clients attendront qu'un client interagisse avec le serveur. Afin de résoudre ce problème, une approche multi-thread est adoptée.
Utilisez la classe SuperSocket pour hériter de la classe socket et implémenter l'interface Runnable pour réaliser un fonctionnement multithread.

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. Serveur

L'architecture du serveur est présentée dans la troisième partie et le code est implémenté comme suit

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();
            //连接完成后创建输入流
            is = socket.getInputStream();
            //读取客户端传送信息
            int len = is.read(buffer);
            String str = new String(buffer, 0, len);
            System.out.println(str);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Client

L'architecture du client est présentée dans la troisième partie et le code est implémenté comme suit

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");
            //规定端口号,建立套接字
            int port = 9998;
            socket = new Socket(address,port);
            //绑定套接字的输出流
            os = socket.getOutputStream();
            sca = new Scanner(System.in);
            while(true) {
                message = sca.next();
                //写入输出流,在局域网中传输
                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();
            }
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer