이전 :
어쩌면 그것은 그 시대의 끝일지도 모르고 다양한 코스 디자인이 차례로 나옵니다. 최근에 나는 소켓 기반 채팅 프로그램을 작성하는 CSSDN에 대한 두 가지 질문과 답변을 보았습니다. 나는 최근에 소켓으로 무언가를했다. 관심이 없어서, 나는 자유 시간의 밤을 노크하는 데 몇 밤을 보냈습니다. 현재 단일 채팅, 그룹 채팅 및 파일 전송 기능 만 지원합니다. 먼저, 나는 추악한 프로그램 이미지를 게시했습니다 (UI는 Java Swing으로 작성되었습니다. 오랫동안 이것을 잊어 버렸으므로 JDK API를 읽을 수 없었습니다.
서버 설계 :
서버에는 두 가지 주요 작업이 있습니다. 하나는 수신 클라이언트의 소켓을 차단하고 응답 처리를 수행하고 다른 하나는 클라이언트의 심장 박동을 감지하는 것입니다. 클라이언트가 일정 시간 동안 하트 비트를 보내지 않으면 클라이언트를 제거하고 서버 소켓을 만들고 두 개의 스레드 풀을 시작 하여이 두 가지를 처리합니다 (NewFixedThreadpool, NewsCheDuledthreadpool). 해당 처리 클래스는 SocketDispatcher 및 SocketSchedule입니다. SocketDispatcher는 다른 소켓 요청에 따라 다른 Sockethandlers에 분배됩니다. SocketWrapper는 소켓에 쉘 래퍼를 추가하고 소켓의 최신 상호 작용 시간을 Socketholder Stores와 함께 현재 서버와 상호 작용하는 소켓 컬렉션을 기록합니다. 디자인은 다음과 같습니다.
클라이언트 디자인 :
클라이언트 디자인은 주로 두 부분으로 나뉩니다. 즉 소켓 통신 모듈 디자인 및 UI 관련 설계
클라이언트 소켓 통신 설계는 실제로 서버의 설계와 유사합니다. 차이점은 서버가 하트 비트 패킷을 수신하고 클라이언트는 하트 비트 패킷을 보냅니다. 클라이언트는 하나의 서버 와만 통신하기 때문에 (클라이언트 간의 통신은 서버에서도 배포됩니다) 크기 2의 스레드 풀만이 두 가지를 처리하는 데 사용됩니다 (Newfixedthreadpool (2)). 해당 처리 클래스는 수신자 및 Keepalivedog입니다. 수신자가 초기화되면 클라이언트에 대한 콜백으로 콜백이 서버 메시지를 수신합니다. 콜백의 기본 구현은 DefaultCallback입니다. DefaultCallback은 다른 이벤트에 따라 HF를 통해 다른 핸들러에 배포됩니다. 고객 보유자는 현재 클라이언트 정보를 저장합니다. 디자인은 다음과 같습니다.
UI 관련 디자인, 나는 혼자서 UI를 쓸 계획이 없습니다. 결국, 내가 쓴 것은 너무 못 생겼으므로 반 친구 나 친구들에게 나중에 노크를하도록 도와달라고 부탁 할 수 있으므로 UI 이벤트 처리를 처리하여 UI 디자인 및 이벤트 응답을 간단히 분리합니다. 모든 UI는 JFrame을 상속하고보기 인터페이스를 구현합니다. 위의 핸들러 구현 클래스는 라우터를 통해 얻습니다 (존재하는 경우 직접 반환되며 존재하지 않으면 생성 및 저장됩니다). 보기는 UI Creation ()을 제공하고, 컨테이너 ()를 얻고, UI getComponent (), display ()에서 구성 요소를 가져오고 쓰레기 (); ResultWrapper 및 Resultholder는 채팅 탭을 작성하고 저장하기위한 것입니다.
일반적인 모듈 설계 :
공통 모듈은 주로 데이터 상호 작용으로 JSON 데이터가 상호 작용에 사용됩니다. 공통 모듈은 다양한 유형의 상호 작용 정보를 정의합니다. Sendhelper가 구현 한 소켓 정보의 전송은 언어이며, ConstantValue는 시스템의 구성 및 상수입니다 (상수는 모두 인터페이스가 아니기 때문에 그다지 좋지 않을 수 있습니다). ReturnMessage의 경우 컨텐츠 속성으로 일련의 DTO가 있습니다.
프로그램 입력 :
마지막으로, 서버 및 클라이언트의 입구 프로그램이 제공됩니다 (전체 코드는 CSDN에 매달려 있으며 시간이 있으면 지속적으로 업데이트되며 기사에는 끝에 주소가 있습니다).
서버 포털 :
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.schedecutortervice; java.util.concurrent.timeUnit; import yaolin.chat.common.constantValue; import yaolin.chat.util.loggerutil;/*** @author yaolin*/public class server {private serversocket server; 개인 최종 ExecutorService 풀; public server ()는 ioexception {server = new serversocket (constantValue.server_port); pool = executors.newfixedthreadpool (constantValue.max_pool_size); } public void start () {try {ScheduleDexecutorService Schedule = Executors.NewScheduledThreadPool (1); // 개를 시청합니다. 예외?? Schedule.SchedUeAtfixEdrate (new SocketSchedule (), 10, constantValue.time_out, timeUnit.seconds); while (true) {pool.execute (New SocketDispatcher (Server.Accept ())); loggerutil.info ( "" + new date ()에서 클라이언트 수락); }} catch (ioexception e) {pool.shutdown (); }} public static void main (String [] args) {try {new server (). start (); } catch (ioexception e) {loggerutil.error ( "서버 시작 실패! ->" + 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 클래스 NILOAYCHAT {public static void main (String [] args) {registerAndLoginView v = (RegisterAndLoginView) router.getView (registerAndLoginView.class) .create (); {v.display (); 클라이언트 클라이언트 = 새 클라이언트 (new defaultCallback ()); client.start (); clientholder.setclient (클라이언트); } catch (ioException e) {joptionpane.showmessagedialog (v.getContentPane (), e.getMessage ()); }}} 소스 코드 다운로드 : 데모
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.