처음부터 메시징 서버 구축. (자바)

이에 대한 충분한 이해가 필요합니다.
자바,
서버소켓,
ClientSocket.

최신 앱 서버가 단일 인스턴스로 수백만 개의 연결로 확장되는 방법을 이해할 수 없었을 때 그것을 구축하려는 동기가 생겼습니다. 그래서 작업을 시작했습니다. 제가 건축을 시작할 때 인터넷에서 많은 도움을 얻을 수 없었기 때문에 이 문서를 작성합니다...

코드에서 바로 점프.

이것은 ConcurrentServer가 실행을 시작할 기본 클래스입니다.

class ConcurrentServer{
     public static void main(String[] arg) throws IOException, InterruptedException
     {
            int port;
            if(arg.length == 0){
              port = 8080;
            }
            else{
              port = Integer.parseInt(arg[0]);
            }

            new ConcurrentServer().start(port);
     }
}



잠시 기다리세요....
여기List<User> clients를 기억하십시오. 중요한 역할을 합니다.

public class Shared {

    public static List<User> clients = new ArrayList<>();

    public static int count= 0;

    private Shared(){

    }
}



새 사용자가 서버에 연결되면 연결 개체가 Shared 클래스의 클라이언트 목록으로 푸시됩니다(아래 참조).

아래의 User 클래스는 ClientSocket 에서 확장됩니다.

public ConcurrentServer{
    public static void main.....
    .
    .
    .
    .

    public void start(int port) throws IOException, InterruptedException{   
        try(ServerSocket server = new ServerSocket(port)){

            Thread channelReaderThread = new Thread(channelReader);
            channelReaderThread.start();

            while(ALWAYS_RUNNING){
                User client = new User(server.accept());
                Shared.clients.add(client);
            }
        }
    }   
}



다음으로 언제든지 팝업될 수 있는 사용자 메시지를 읽습니다.

private void process()
{
    int maxSize = Shared.clients.size();

    for(int i = 0 ; i < maxSize ; i++)
    {
        User user = Shared.clients.get(i);

        queryClient(user, i);
    }
}

private void queryClient(User user,int index)
{
    InputStream inputStream = user.getInputStream();

    if( inputStream.available() <= 0 )
    {
        return;
    }

    ConnectedBy connection = user.getConnectionType();

    connection.handle(user);
}

이 사람Shared.clients을 기억하세요. 연결된 사용자를 메인 스레드로 푸시한 배열입니다.

위의 process 메서드는 100ms마다 트리거 실행됩니다. Java는 inputStream.available()이라는 메서드를 제공합니다. 사용자가 메시지를 보내면 inputStream.available() > 0이 됩니다. 이제 inputStream에서 메시지를 읽을 수 있습니다.


메시지를 읽을 수 있고 이미 모든 clientConnectionsShared.clients가 있으므로 메시지를 반복하고 들어오는 메시지를 포함된 모든 클라이언트에 보낼 수 있습니다.

따라서 작동하는 메시징 응용 프로그램이 있습니다.


수천 개의 병렬 연결로 테스트되었으며 대부분 메시지를 전달합니다.
그러나 주의.
메시지가 삭제되는 경우가 있습니다. 이 메시지가 삭제되는 이유를 아직 알 수 없습니다. 그래서 어떤 도움이라도 대단히 감사하겠습니다.

그것을 이해하거나 이해하지 못한 사람은 댓글을 달아주세요. 연락하고 싶습니다.

소스 코드. https://github.com/SrikanthYashaswi/messenger

좋은 웹페이지 즐겨찾기