자바 기반 Socket 채 팅 프로그램-초기 디자인(데모 첨부)

앞 에 쓰기:
최근 말 이 되 었 는 지 각종 과정 디자인 이 이 어 졌 습 니 다.최근 csdn 에서 두 개의 똑 같은 문답 을 보 았 습 니 다.그것 은 바로 socket 기반 채 팅 프로그램 을 만 드 는 것 입 니 다.마침 최근 에 socket 으로 일 을 했 습 니 다.취미 로 몇 밤 동안 여가 시간 을 내 서 두 드 렸 습 니 다.현 재 는 싱글 채 팅,단체 채 팅,파일 전송 만 지원 합 니 다.먼저,못 생 긴 프로그램 그림 을 붙 입 니 다.(UI 는 자바 스윙 으로 작 성 했 습 니 다.이것 은 이미 다 잊 어 버 렸 습 니 다.어 쩔 수 없 이 JDK 의 API 를 보고 썼 습 니 다)다음 그림 입 니 다.

 서버 설계:
서버 는 주로 두 가지 조작 이 있 습 니 다.하 나 는 클 라 이언 트 를 받 는 socket 을 막 고 응답 처 리 를 하 는 것 입 니 다.다른 하 나 는 클 라 이언 트 의 심장 박동 을 검사 하 는 것 입 니 다.클 라 이언 트 가 한 동안 심장 박동 을 보 내지 않 으 면 이 클 라 이언 트 를 제거 하고 Server 에서 ServerSocket 을 만 든 다음 에 두 개의 스 레 드 풀 을 시작 하여 이 두 가지 일 을 처리 합 니 다(new Fixed ThreadPool,new Scheduled ThreadPool).대응 하 는 처리 클래스 는 각각 SocketDispatcher,SocketSchedule 이다.그 중에서 SocketDispatcher 는 socket 의 서로 다른 요청 에 따라 서로 다른 SocketHandler 에 게 나 누 어 처리 하고 SocketWrapper 는 socket 에 케이스 포장 을 한 층 더 해서 lastAliveTime 으로 socket 의 최신 상호작용 시간 을 기록 하고 SocketHolder 는 현재 서버 와 상호작용 하 는 socket 집합 을 저장한다.디자인 은 다음 과 같다.

클 라 이언 트 디자인:
클 라 이언 트 디자인 은 주로 두 부분 으로 나 뉘 는데 그것 이 바로 socket 통신 모듈 디자인 과 UI 관련 디자인 이다.
클 라 이언 트 socket 통신 디자인,이곳 의 디자인 은 사실 서버 의 디자인 과 차이 가 많 지 않 습 니 다.다른 것 은 서버 가 심 박 수 를 받 는 것 이 고 클 라 이언 트 는 심 박 수 를 보 내 는 것 입 니 다.클 라 이언 트 는 한 서버 와 만 통신 하기 때 문 입 니 다(클 라 이언 트 간 의 통신 도 서버 에서 진행 하여 나 누 어 줍 니 다).그래서 여 기 는 두 가지 일(new Fixed ThreadPool(2)을 처리 하 는 크기 가 2 인 스 레 드 풀 만 사 용 했 습 니 다.해당 하 는 처리 종 류 는 ReceiveListener,KeepAlivedog 입 니 다.그 중에서 ReceiveListener 는 초기 화 할 때 하나의 Callback 을 클 라 이언 트 로 서 서버 의 메 시 지 를 받 은 메 시 지 를 되 돌려 줍 니 다.Callback 의 기본 구현 은 Default Callback 입 니 다.DefaultCallback 은 서로 다른 이벤트 에 따라 HF 를 통 해 서로 다른 Handler 에 게 배포 하고 클 라 이언 트 Holder 는 현재 클 라 이언 트 정 보 를 저장 합 니 다.디자인 은 다음 과 같 습 니 다.

UI 관련 디자인,여기 서 저 는 UI 를 쓰 려 고 하지 않 습 니 다.제 가 너무 못 생 겼 기 때문에 나중에 친구 나 친구 에 게 두 드 려 달라 고 할 수 있 습 니 다.그래서 저 는 UI 의 사건 처 리 를 모두 Action 에 맡 기 고 UI 디자인 과 사건 응답 을 간단하게 분리 합 니 다.모든 UI 는 JFrame 을 계승 하고 View 인 터 페 이 스 를 실현 합 니 다.위의 Handler 실현 류 는 Router 를 통 해 얻 을 수 있 습 니 다(존재 하면 바로 되 돌아 갑 니 다.존재 하지 않 으 면 생 성 및 저장)지정 한 UI 입 니 다.View 에 서 는 UI 의 생 성 create(),container()가 져 오기,UI 의 구성 요소 getComponent()가 져 오기,display()를 표시 하고 trash()를 회수 합 니 다.ResultWrapper 와 ResultHolder 는 채 팅 옵션 을 만 들 고 저장 하기 위 한 것 입 니 다.

 Common 모듈 디자인:
Common 모듈 은 주로 데이터 상호작용 입 니 다.여 기 는 JSON 데 이 터 를 사용 하여 상호작용 을 합 니 다.common 모듈 은 각종 상호작용 정 보 를 정 의 했 습 니 다.SendHelper 가 실현 하 는 socket 정보의 전송,I18N 은 언어 이 고 ConstantValue 는 시스템 의 설정 과 상수 입 니 다.(여 기 는 상수 가 인터페이스 로 되 어 있 는데 이것 은 좋 지 않 을 수 있 습 니 다)ReturnMessage 에 대해 일련의 DTO 를 콘 텐 츠 속성 으로 합 니 다.

 프로그램 입구:
마지막 으로 서버 와 클 라 이언 트 의 입구 프로그램 을 드 립 니 다.(전체 코드 는 csdn 에 걸 려 있 고 시간 이 있 으 면 계속 업데이트 되 며 글 의 마지막 주소 가 있 습 니 다)
서버 입구:

package yaolin.chat.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import yaolin.chat.common.ConstantValue;
import yaolin.chat.util.LoggerUtil;

/**
 *    
 * @author yaolin
 */
public class Server {

  private final ServerSocket server;
  private final ExecutorService pool;
  
  public Server() throws IOException {
    server = new ServerSocket(ConstantValue.SERVER_PORT);
    pool = Executors.newFixedThreadPool(ConstantValue.MAX_POOL_SIZE);
  }

  public void start() {
    try {
      ScheduledExecutorService schedule = Executors.newScheduledThreadPool(1);
      // Watch dog. Exception??
      schedule.scheduleAtFixedRate(new SocketSchedule(), 10, ConstantValue.TIME_OUT, TimeUnit.SECONDS);

      while (true) {
        pool.execute(new SocketDispatcher(server.accept()));
        LoggerUtil.info("ACCEPT A CLIENT AT " + new Date());
      }
    } catch (IOException e) {
      pool.shutdown();
    }
  }
  
  
  public static void main(String[] args) {
    try {
      new Server().start();
    } catch (IOException e) {
      LoggerUtil.error("Server start failed! -> " + e.getMessage(), e);
    }
  }
}

클 라 이언 트 입구:

package yaolin.chat.client;

import java.io.IOException;

import javax.swing.JOptionPane;

import yaolin.chat.client.callback.DefaultCallback;
import yaolin.chat.client.view.Router;
import yaolin.chat.client.view.impl.RegisterAndLoginView;

/**
 * 
 * @author yaolin
 *
 */
public class NiloayChat {

  public static void main(String[] args) {
    RegisterAndLoginView v = (RegisterAndLoginView) Router.getView(RegisterAndLoginView.class).create();
    try {
      v.display();
      Client client = new Client(new DefaultCallback());
      client.start();
      ClientHolder.setClient(client);
    } catch (IOException e) {
      JOptionPane.showMessageDialog(v.getContentPane(), e.getMessage());
    }
  }
}


원본 다운로드:demo
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기