>  기사  >  Java  >  Java에서 다중 스레드 LAN 채팅방을 만드는 방법

Java에서 다중 스레드 LAN 채팅방을 만드는 방법

王林
王林앞으로
2023-05-09 12:34:141394검색

1.TCP

LAN 연결을 위해서는 정보 전송의 원리를 알아야 합니다.
LAN에서 전송되는 정보는 패킷 형태로 데이터를 전송하는데 TCP 패킷에 IP 패킷이 캡슐화되어 있습니다.
다음 문장은 고정 IPV4 프로토콜 클래스를 통해 서버의 IP 주소를 얻는 것입니다.

address = InetAddress.getByName("192.168.43.86");

2.Socket

은 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 Architecture

Java에서 다중 스레드 LAN 채팅방을 만드는 방법

Java 클래스의 관점에서 서버와 클라이언트는 소켓 연결을 통해 연결을 추상화합니다. 서버는 자신의 소켓 포트를 설정하고 클라이언트가 이 포트에 연결하는지 모니터링하여 정보 읽기 기능을 구현합니다. 클라이언트는 서버가 동의한 포트 번호를 통해 서버로 데이터를 전송합니다. 서버가 켜진 후 클라이언트를 실행하고 서버와 3방향 핸드셰이크를 수행하여 TCP 연결을 설정하고, 이 연결을 기반으로 클라이언트와 서버 간의 통신이 구현됩니다.

4. 멀티 스레딩

서버가 동시에 여러 개체를 서비스할 수 있으므로 기존 방법을 서버 연결에 사용하면 하나의 클라이언트가 서버와 상호 작용할 때까지 여러 클라이언트가 대기하게 됩니다. 이 문제를 해결하기 위해 멀티스레딩 접근 방식이 채택되었습니다.
SuperSocket 클래스를 사용하여 소켓 클래스를 상속하고 Runnable 인터페이스를 구현하여 멀티스레드 작업을 구현합니다.

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

세 번째 부분에서는 서버의 아키텍처를 보여주고, 코드는 다음과 같이 구현됩니다.

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

세 번째 부분에서는 클라이언트의 아키텍처를 보여주고, 코드를 구현합니다. 다음과 같습니다

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();
            }
        }
    }
}

위 내용은 Java에서 다중 스레드 LAN 채팅방을 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제