첫째, 프런트 엔드 코드 :
<! DOCTYPE HTML > < HTML LANG = "EN" 의 xmlns = 'http://www.w3.org/1999/xhtml' > < 선두 > < 메타 캐릭터 = "UTF-8" /> < 타이틀 > </ 타이틀 > < / 헤드 > < 본문 > < 입력 타입 = "버튼" ID = "전송" 의 onclick = "송신 ()" 값 = "发送" > < 입력 유형 = "텍스트" 스크립트 유형 = "텍스트 / 자바 스크립트" > var에 소켓; IF ( 대해서 typeof (A 웹 소켓) == " 정의되지 않은 " ) { 경고 ( " 귀하의 브라우저가 웹 소켓을 지원하지 않습니다 " ); } / * 웹 소켓의 두 가지 방법이 있습니다 : 1 , 송신 ()는 원격 서버로 데이터를 전송하는 웹 소켓 연결을 닫으 2, () * / / * 웹 소켓은 또한 여러 리스너 함수 정의 네트워크 연결이 설정 될 때이 이벤트 트리거의 OnOpen 1, 2 네트워크 오류시의 OnError 발생하면 트리거 이벤트 (3)는,으로 onClose 이벤트 폐쇄 웹 소켓 때 트리거 트리거 서버로부터 송신 된 메시지를 수신하는 이벤트가 통신이 가장 중요한 이벤트 리스너 4, 웹 소켓의 onMessage. msg.data * / var에 소켓 = 새로운 웹 소켓 ( ' WS를 : // 로컬 호스트 : 52992 / WS ' ); // 打开事件 socket.onopen = 함수 (E) { 경보 ( " 소켓已打开" ); CONSOLE.LOG는 ( " 연결! " ); } socket.onclose = 함수 (E) { 경보 ( " 소켓已关闭" ); 을 console.log ( " 연결 끊김! " ); } socket.onmessage = 함수 (E) { 경보 ( " 소켓 메시지 보내기 " ) CONSOLE.LOG는 ( " : 메시지 수신 " + ; e.data)를 } socket.onerror = 함수 (E) { 경보 ( " 소켓 네트워크 오류가 발생 " ) CONSOLE.LOG (e.data) } // 함수 송신 () { // VAR oText = document.getElementById를 ("메시지 "); // socket.send (oText.value); // } // 당신은 사용자 정의 할 수 없습니다 기능을전송 () { var에 otext = document.getElementById를 ( " 메시지 " ); socket.send ( " sendMessage 첨부 " , otext.value); } socket.receivemessage = 함수 (E) { 경보 ( " 소켓发送消息" ); 을 console.log ( " 接收消息: " + e.data); } </ 스크립트 > </ 몸 > </ HTML >
시작 구성 :
사용 Microsoft.AspNetCore.Builder 단계; 사용 Microsoft.AspNetCore.Hosting 단계; 사용 Microsoft.AspNetCore.Http 단계; 사용 Microsoft.AspNetCore.Mvc 단계; 사용 Microsoft.Extensions.Configuration 단계; 사용 Microsoft.Extensions.DependencyInjection 단계; 사용하여 시스템; 사용 System.Net.WebSockets 단계; 사용 하여 System.Threading 단계; 사용 System.Threading.Tasks 단계; 사용 test.Hubs 단계; // 3,引用处理客户端-服务器通信的高级管道 네임 스페이스 테스트 { 공공 클래스 시작 { 공개시작 (IConfiguration 구성) { 구성 = 구성; } 공공 IConfiguration 구성 { GET ; } // 이 메소드는 런타임에 의해 호출됩니다. 컨테이너에 서비스를 추가하려면이 방법을 사용합니다. 공공 무효 ConfigureServices (IServiceCollection 서비스) { services.Configure <CookiePolicyOptions> (옵션 => { // 이 람다가 중요하지 않은 쿠키를 사용자의 동의가 주어진 요청에 대한 필요 여부를 결정합니다. options.CheckConsentNeeded = 환경 => 사실; options.MinimumSameSitePolicy = SameSiteMode.None; }); . services.AddMvc () SetCompatibilityVersion (CompatibilityVersion.Version_2_1); services.AddSignalR (); // 1,添加服务은 } // 이 메소드는 런타임에 의해 호출됩니다. HTTP 요청 파이프 라인을 구성하려면이 방법을 사용합니다. 공공 무효 구성 (IApplicationBuilder 응용 프로그램, IHostingEnvironment의 ENV) { 경우 (env.IsDevelopment ()) { app.UseDeveloperExceptionPage (); } 다른 { app.UseExceptionHandler ( " / 홈 / 오류 " ); } // 跨域 app.UseCors (빌더 => { builder.SetIsOriginAllowed (출처 => 사실 ) .AllowAnyHeader () .WithMethods ( " GET " , " POST " ) .AllowCredentials (); }); // 静态资源 app.UseStaticFiles (); // 쿠키 app.UseCookiePolicy (); // 1의 구성 미들웨어 웹 소켓 app.UseWebSockets (); // 2检查它是否是웹 소켓请求并接受웹 소켓请求. app.Use ( 비동기 다음 (컨텍스트) => { 경우 (context.Request.Path == " / WS " ) { 경우 (context.WebSockets.IsWebSocketRequest ) { 웹 소켓 웹 소켓 = AWAIT context.WebSockets.AcceptWebSocketAsync (); AWAIT 에코 (문맥, 웹 소켓) } 다른 { context.Response.StatusCode = 400 ; } } 다른 { AWAIT 다음 (); } }); // 구성 signalr 경로 // app.UseSignalR (= 노선> // 2 참조 // { // routes.MapHub <ChatHub > ( "/ chatHub"); // }) // MVC 패턴 app.UseMvc (노선 => { routes.MapRoute ( 이름 : "기본 " , 템플릿 : " {컨트롤러 = 홈} / {행동 = 인덱스} / {ID?} " ); }); } # 지역 에코 개인 비동기 작업 에코 (HttpContext를 문맥, 웹 소켓 웹 소켓) { var에 버퍼 = 새로운 바이트 [ 1024 * 4 ] 결과 WebSocketReceiveResult = AWAIT webSocket.ReceiveAsync를 ( 새로운 ArraySegment < 바이트 > (버퍼) CancellationToken.None) 동안 (!result.CloseStatus.HasValue) { AWAITwebSocket.SendAsync ( 새로운 ArraySegment < 바이트 > (버퍼 0 ) result.Count을 result.MessageType, result.EndOfMessage, CancellationToken.None); 결과 = AWAIT webSocket.ReceiveAsync ( 새로운 ArraySegment < 바이트 > (버퍼)를 CancellationToken.None); } AWAIT webSocket.CloseAsync (result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); } #endregion } }
주 : 메소드를 정의 할 수있는 방법