이 기사는 온라인 웹 커뮤니케이션의 요구를 충족시키는 예를 공유합니다. Java Socket에서 구현 한 온라인 채팅 기능의 웹 버전으로 인해 특정 콘텐츠는 다음과 같습니다.
구현 단계 :
1. AWT 구성 요소와 소켓을 사용하여 간단한 단일 클라이언트를 구현하여 서버에 메시지를 지속적으로 보냅니다.
2. 스레드와 결합하여 메시지를 보내기 위해 서버에 대한 멀티 클라이언트 연결을 실현하십시오.
3. 서버를 모든 클라이언트에 전달하고 동시에 클라이언트에 표시하는 서버를 구현하십시오.
4. AWT 구성 요소에 의해 생성 된 창 인터페이스를 프론트 엔드 JSP 또는 HTML로 표시된 인터페이스로 변경하고 Java 소켓에 의해 구현 된 클라이언트를 프론트 엔드 기술 구현으로 변경하십시오.
여기서 우리는 먼저 첫 번째 단계의 간단한 기능을 구현합니다. 어려움은 다음과 같습니다.
1. AWT 구성 요소를 사용한 적이 없으며 Java 관련 청취 이벤트를 사용한 적이 없습니다.
2. 클라이언트와 서버를 상호 작용하기 위해 오랜 시간 동안 소켓을 사용하지 않았으며 실제로 CSS 구조를 개발하지 않았습니다.
기능을 구현하기위한 코드 :
온라인 채팅 클라이언트 :
1. 그래픽 창 인터페이스 개요를 생성합니다
2. 개요에 긴밀한 이벤트를 추가하십시오
3. 개요에 입력 영역 및 컨텐츠 디스플레이 영역을 추가하십시오.
4. 입력 영역에 캐리지 리턴 이벤트 추가
5. 서버 연결을 설정하고 데이터를 전송합니다
패키지 chat.chat; java.awt.borderlayout import; import java.awt.frame; Java.awt.TextArea 가져 오기; java.awt.textfield import; import java.awt.event.actionevent; import java.awt.event.actionListener; java.awt.event.windowadapter를 가져옵니다. java.awt.event.windowevent import; import java.io.dataOutputStream; import java.io.ioexception; import java.net.socket; import java.net.unknownhostexception; / ** * 온라인 채팅 클라이언트 1. 그래픽 창 인터페이스 개요 생성 2. 개요에 가까운 이벤트 추가 3. 입력 영역과 컨텐츠 디스플레이 영역을 개요에 추가 4. 입력 영역에 대한 캐리지 리턴 이벤트 추가 * 5. 서버 연결을 설정하고 데이터를 보내십시오 * * @Author tuzongxun123 * */ public class chat clast frame {// user class expectfult em (public textfult and from) {// public class intectfild and. // 컨텐츠 디스플레이 영역 비공개 텍스트주의 맛 = 새로운 TextRea (); 개인 소켓 소켓 = NULL; // 데이터 출력 스트림 비공개 DataOutStream DataOutputStream = NULL; public static void main (String [] args) {new ChatClient (). launcframe (); } / ** * 간단한 그래픽 창을 만듭니다 * * @author : tuzongxun * @title : launcframe * @param * @return void * @date 2016 년 5 월 18 일 9:57:00 AM * @throws * / public void launcframe () {setLocation (300, 200); this.setsize (200, 400); 추가 (tftxt, borderlayout.south); 추가 (Tarea, Borderlayout.north); 팩(); // 그래픽 인터페이스 창의 닫기 이벤트를 듣습니다. tftxt.addactionListener (new tflister ()); setvisible (true); 연결하다(); } / ** * 서버에 연결 * * @author : tuzongxun * @title : connect * @param * @return void * @date 2016 년 5 월 18 일 9:56:49 am * @throws * / public void connect () {// 새로운 서버 연결 Socket = New Socket ( "127.0.0.1", 8888); // 클라이언트 출력 가져 오기 스트림 DataOutputStream = 새 DataOutputStream (socket.getOutputStream ()); System.out.println ( "서버에 연결"); } catch (unknownHostException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} / ** * 클라이언트 리소스 닫기 * * @author : tuzongxun * @title : 링크 앤 @param * @return void * @date 2016 년 5 월 18 일 9:57:46 AM * @throws * / public void disphonnect () {try {dataOutputStream.close (); socket.close (); } catch (ioexception e) {e.printstacktrace (); }} / ** * 서버로 메시지 보내기 * * @author : tuzongxun * @title : sendmessage * @param @param text * @return void * @date 9:57:56 AM * @throws * / private void sendmessage (string text) {try attrupstream.writeUtf (text); DataOutputStream.flush (); } catch (ioexception e1) {e1.printstacktrace (); }} / ** * 캐리지 리턴 이벤트를 듣기위한 그래픽 창 입력 영역 * * @author tuzongxun123 * * / private class tflister 구현 actionListener {@override public void actionPerformed (ActionEvent e) {문자열 text = tftxt.getText (). trim (); Taxa.settext (텍스트); tftxt.settext ( ""); // 서버로 데이터를 보내십시오 SendMessage (텍스트); }}} 섬기는 사람:
패키지 chat.chat; import java.io.datainputstream; import java.io.eofexception; import java.io.ioexception; java.net.bindexection 가져 오기; import java.net.serversocket; import java.net.socket; /*** Java는 소켓 및 AWT 구성 요소를 사용하여 온라인 채팅 기능을 구현합니다. 서버는 한 클라이언트가 연결된 후 서버에 메시지를 지속적으로 보낼 수있는 서버 연결을 인식 할 수 있지만 동시에 여러 클라이언트가 연결하도록 지원하지 않습니다. 그 이유는 코드에서 클라이언트 연결을 얻은 후 클라이언트 입력이 루프로 계속 들려 주어 서버가 다른 클라이언트를 두 번들을 수 없도록 막아냅니다. 구현하려면 비동기식 또는 멀티 스레드를 사용해야합니다 * * @author tuzongxun123 */ public class chatserver {public static void main (string [] args) {// 서버가 성공적으로 시작되었는지 부울 isstart = false; // Server Socket ServerSocket SS = NULL; // 클라이언트 소켓 소켓 소켓 = NULL; // 서버 읽기 클라이언트 데이터 입력 스트림 DatainputStream DatainputStream = null; {// start server ss = new serversocket (8888); } catch (bindException e) {System.out.println ( "포트가 이미 사용 중입니다"); // 프로그램 시스템을 닫습니다 .exit (0); } catch (예외 e) {e.printstacktrace (); } try {isstart = true; while (isstart) {boolean isconnect = false; // 청취 소켓 시작 = ss.accept (); System.out.println ( "하나의 클라이언트 연결"); isconnect = true; while (isconnect) {// 클라이언트 입력 스트림을 가져옵니다 DatainputStream = new DatainputStream (socket.getInputStream ()); // 클라이언트가 전달한 데이터를 읽습니다. String Message = DatainputStream.readutf (); System.out.println ( "클라이언트 :" + 메시지); }}} catch (eofexception e) {system.out.println ( "클라이언트 폐쇄!"); } catch (예외 e) {e.printstacktrace (); } 마지막으로 {// 관련 리소스를 닫으십시오. {datainputStream.close (); socket.close (); } catch (ioexception e) {e.printstacktrace (); }}}}계속, 단일 클라이언트 연결을 기반으로 두 번째 단계는 여러 클라이언트 연결을 구현해야하므로 스레드를 사용해야합니다. 새 클라이언트가 연결 될 때마다 서버는 처리를 위해 새 스레드를 시작해야하므로 이전 루프 판독 값에서 차단 문제를 해결해야합니다.
스레드를 작성하는 두 가지 방법의 두 가지 방법이 있습니다 : 스레드 통합 또는 실행 가능한 인터페이스 구현. 원칙적으로, 런 가능성을 구현할 수 있다면 인터페이스를 구현하는 방법이 더 유연하기 때문에 상속되지 않습니다.
클라이언트 코드는 이전에 비해 변경되지 않았으며 서버가되었으므로 서버 코드 만 여기에 게시됩니다.
Java는 소켓 및 AWT 구성 요소 및 멀티 스레딩을 사용하여 온라인 채팅 기능 서버를 간단히 구현합니다.
여러 클라이언트가 연결된 후 메시지는 서버로 지속적으로 전송됩니다. 첫 번째 버전과 비교하여 멀티 스레딩 사용에 중점을 둡니다. 서버는 아직 전달 기능을 구현하지 않았습니다. 클라이언트는 그래픽 창에서 자체적으로 입력 한 정보 만 볼 수 있으며 다른 클라이언트가 보낸 메시지를 볼 수 없습니다.
패키지 chat.chat; import java.io.datainputstream; import java.io.eofexception; import java.io.ioexception; java.net.bindexection 가져 오기; import java.net.serversocket; import java.net.socket; import java.net.socketexception; / ** * * * @author tuzongxun123 * */ public class chatserver {public static void main (String [] args) {new Chatserver (). start (); } // 서버가 성공적으로 시작되었는지 여부는 개인 부울 isstart = false; // 서버 소켓 비공개 서버 소켓 SS = NULL; // 클라이언트 소켓 개인 소켓 소켓 = NULL; public void start () {try {// start server ss = new serversocket (8888); } catch (bindexception e) {System.out.println ( "포트 중 사용 중"); // 프로그램 시스템을 닫습니다 .exit (0); } catch (예외 e) {e.printstacktrace (); } try {isstart = true; while (isstart) {// 청취 시작 소켓 = ss.accept (); System.out.println ( "하나의 클라이언트 연결"); // 클라이언트 시작 스레드 클라이언트 클라이언트 = 새 클라이언트 (소켓); 새 스레드 (클라이언트) .start (); }} catch (예외 e) {e.printstacktrace (); } 마침내 {// 서비스를 닫으십시오 {ss.close (); } catch (ioexception e) {e.printstacktrace (); }}} / ** * 클라이언트 스레드 * * @author tuzongxun123 * * / 클라이언트 클라이언트 구현 실행 가능 {// 클라이언트 소켓 개인 소켓 소켓 = null; // 클라이언트 입력 스트림 private datainputStream datainputStream = null; 개인 부울 isconnect = false; 공개 클라이언트 (소켓 소켓) {this.socket = 소켓; try {isconnect = true; // 클라이언트 입력을 얻습니다. stream datainputStream = new DatainputStream (socket.getInputStream ()); } catch (ioexception e) {e.printstacktrace (); }} @override public void run () {isconnect = true; try {while (isconnect) {// 클라이언트 문자열로 전달 된 데이터를 읽습니다. System.out.println ( "클라이언트 :" + 메시지); }} catch (eofexception e) {system.out.println ( "클라이언트 닫기!"); } catch (pocketexception e) {System.out.println ( "클라이언트가 닫힙니다 !!!"); } catch (예외 e) {e.printstacktrace (); } 마지막으로 {// 관련 리소스를 닫으십시오. {datainputStream.close (); socket.close (); } catch (ioexception e) {e.printstacktrace (); }}}}}위의 내용은 주로 스레드를 사용하여 서버가 다중 클라이언트 요청을 수신 할 수있는 기능을 소개합니다. 여기서 클라이언트는 연결된 각 클라이언트에게 메시지를 전달하는 동안 멀티 클라이언트 메시지를 수신해야하며 클라이언트는 콘텐츠 디스플레이 영역에 표시 할 수있어서 간단한 온라인 그룹 채팅을 실현해야합니다.
클라이언트 전달을 구현할 때는 출력 스트림을 증가시키는 것 이상입니다. 이전에 클라이언트는 전송되었지만받지 못했기 때문에 원형 방식으로 서버 메시지를 수신하도록 클라이언트를 변경해야하므로 멀티 스레딩도 구현해야합니다.
이 기능을 구현할 때 실수로 검증 코드를 무작위로 생성하는 기능을 기억 했으므로 각 클라이언트의 이름을 무작위로 생성하는 데 갑자기 영감을 얻었으므로 출력 할 때 그룹 채팅과 비슷해 보일뿐만 아니라 메시지 출력이있을 수 있습니다.
이러한 기능을 구현 한 후에는 기본적으로 여러 사람을 위해 동시에 그룹 채팅을 할 수 있습니다. 코드에는 주요 방법이 있으므로 서버와 클라이언트를 실행 가능한 JAR 패키지로 만들 수 있습니다. 내 다른 블로그 게시물을 참조 할 수 있습니다. Eclipse를 사용하여 Java 프로그램 실행 가능한 JAR 패키지를 만듭니다.
그런 다음 데스크탑에서 해당 JAR 파일을 두 번 클릭하여 서버와 클라이언트를 시작하면 더 이상 실행하려면 Eclipse에 의존 할 필요가 없습니다.
수정 된 클라이언트 코드는 다음과 같습니다.
패키지 chat.chat; java.awt.borderlayout import; import java.awt.frame; Java.awt.TextArea 가져 오기; java.awt.textfield import; import java.awt.event.actionevent; import java.awt.event.actionListener; java.awt.event.windowadapter를 가져옵니다. java.awt.event.windowevent import; import java.io.datainputstream; import java.io.dataOutputStream; import java.io.ioexception; import java.net.socket; import java.net.unknownhostexception; java.util.random import; /** * 온라인 채팅 클라이언트 단계 : * 1. 그래픽 윈도우 인터페이스 개요*2를 생성합니다. 개요*3에 대한 자세한 이벤트를 추가하십시오. 개요*4에 입력 영역과 컨텐츠 디스플레이 영역을 추가하십시오. 입력 영역*5에 대한 캐리지 리턴 이벤트를 추가하십시오. 서버 연결을 설정하고 데이터를 보내십시오 * * @author tuzongxun123 * */ public class chatclient 확장 프레임 {/ ** */ private static final long serialversionuid = 1L; // 사용자 입력 영역 private textfield tftxt = new TextField (); // 컨텐츠 디스플레이 영역 비공개 텍스트주의 맛 = 새로운 TextRea (); 개인 소켓 소켓 = NULL; // 데이터 출력 스트림 비공개 DataOutStream DataOutputStream = NULL; // 데이터 입력 스트림 private datainputStream datainputStream = null; 개인 부울 isconnect = false; Thread Treceive = new Thread (new LeadeVethread ()); 문자열 이름 = ""; public static void main (String [] args) {chatclient chatclient = new ChatClient (); chatclient.createname (); chatclient.launcframe (); } / ** * 간단한 그래픽 창을 만듭니다 * * @author : tuzongxun * @title : launcframe * @param * @return void * @date 2016 년 5 월 18 일 9:57:00 AM * @throws * / public void launcframe () {setLocation (300, 200); this.setsize (200, 400); 추가 (tftxt, borderlayout.south); 추가 (Tarea, Borderlayout.north); // 창의 레이아웃에 따라 프레임의 최적 크기와 구성 요소의 선호하는 크기에 따라 팩 (); // 그래픽 인터페이스 창의 닫기 이벤트를 듣습니다. tftxt.addactionListener (new tflister ()); // setVisible (true)을 볼 수 있도록 창을 설정합니다. 연결하다(); // 메시지 treceive.start ()를 수락하는 스레드를 시작합니다. } / ** * 서버에 연결 * * @author : tuzongxun * @title : connect * @param * @return void * @date 2016 년 5 월 18 일 9:56:49 am * @throws * / public void connect () {// 새로운 서버 연결 Socket = New Socket ( "127.0.0.1", 8888); // 클라이언트 출력 가져 오기 스트림 DataOutputStream = 새 DataOutputStream (socket.getOutputStream ()); datainputStream = new DatainputStream (socket.getInputStream ()); System.out.println ( "서버에 연결"); isconnect = true; } catch (unknownHostException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} // 임의의 클라이언트 이름 생성 public void createName () {string [] str1 = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "Q", ",", ",", ",", ",", ",", ",", ",", ",", ",", ","Q " "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "7", "8", "9", "0", "b", "c", "d", "e", "f", "g", "h", "J", ",", "" "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; 랜덤 ran = new random (); for (int i = 0; i <6; i ++) {// long num = math.round (math.random () * (str1.length -0)+0); // int n = (int) num; int n = ran.nextint (str1.length); if (n <str1.length) {String str = str1 [n]; 이름 = 이름 + str; System.out.println (이름); } else {i-; 계속하다; }} this.setitle (이름); } / ** * 클라이언트 리소스 닫기 * * @author : tuzongxun * @title : 링크 * @param * @return void * @date 2016 년 5 월 18 일 9:57:46 AM * @throws * / public void Disphonnect () {try {isconnect = false; // 스레드 중지 treceive.join (); } catch (InterruptedException e) {e.printstacktrace (); } 마침내 {try {if (dataOutputStream! = null) {dataOutputStream.close (); } if ((null) {socket.close (); 소켓 = null; }} catch (ioexception e) {e.printstacktrace (); }}} / ** * 서버로 메시지 보내기 * * @author : tuzongxun * @title : sendMessage * @param @param text * @return void * @date 2016 년 5 월 18 일 9:57:56 AM * @throws * / private void sendMessage (문자열 텍스트) {dataOutStream.writetf (name + " +); DataOutputStream.flush (); } catch (ioexception e1) {e1.printstacktrace (); }} / ** * 그래픽 창 입력 영역 청취 캐리지 리턴 이벤트 * * @author tuzongxun123 * * / 개인 클래스 tflister 구현 actionListener {@override public void actionPerformed (actionEvent e) {문자열 텍스트 = tftxt.getText (); // 입력 영역을 지우십시오. 정보 tftxt.settext ( ""); // 캐리지를 SendMessage (텍스트)로 눌렀을 때 데이터를 서버로 보냅니다. }} private class 리포 테드 리드 implements runnable {@override public void run () {try {while (isconnect) {string message = datainputStream.readutf (); System.out.println (메시지); 문자열 txt = keyword.getText (); if (txt! = null &&! "". } taxa.settext (메시지); }} catch (ioexception e) {e.printstacktrace (); }}}} 수정 된 서버 코드는 다음과 같습니다.
패키지 chat.chat; import java.io.datainputstream; import java.io.dataOutputStream; import java.io.eofexception; import java.io.ioexception; java.net.bindexection 가져 오기; import java.net.serversocket; import java.net.socket; import java.net.socketexception; java.util.arraylist 가져 오기; Java.util.list 가져 오기; /** * Java는 소켓 및 AWT 구성 요소 및 멀티 스레딩을 사용하여 온라인 채팅 기능 서버를 구현 간단하게 구현합니다. * 서버는 수신 된 클라이언트 정보가 모든 연결된 클라이언트에게 전달되었음을 구현하고 클라이언트 가이 정보를 읽고 컨텐츠 디스플레이 영역에 표시 할 수 있습니다. * * @author tuzongxun123 * */ public class chatserver {public static void main (String [] args) {new Chatserver (). start (); } // 서버가 성공적으로 시작되었는지 여부는 개인 부울 isstart = false; // 서버 소켓 비공개 서버 소켓 SS = NULL; // 클라이언트 소켓 개인 소켓 소켓 = NULL; // 클라이언트 수집 목록 저장 <client> 클라이언트 = New ArrayList <client> (); public void start () {try {// START SS = NEW SERVERVERSOCKE (8888); } catch (bindexception e) {System.out.println ( "포트 중 사용 중"); // 프로그램 시스템을 닫습니다 .exit (0); } catch (예외 e) {e.printstacktrace (); } try {isstart = true; while (isstart) {// 청취 소켓 시작 = ss.accept (); System.out.println ( "하나의 클라이언트 연결"); // 클라이언트 스레드 클라이언트를 시작합니다 클라이언트 = 새 클라이언트 (소켓); 새 스레드 (클라이언트) .start (); clients.add (클라이언트); }} catch (예외 e) {e.printstacktrace (); } 마침내 {// 서비스를 닫으십시오 {ss.close (); } catch (ioexception e) {e.printstacktrace (); }}} / ** * 클라이언트 스레드 * * @author tuzongxun123 * * / private class emplements runnable {// 클라이언트 소켓 비 개인 소켓 = null; // 클라이언트 입력 스트림 private datainputStream datainputStream = null; // 클라이언트 출력 스트림 비공개 DataOutStream DataOutputStream = NULL; 개인 부울 isconnect = false; 공개 클라이언트 (소켓 소켓) {this.socket = 소켓; try {isconnect = true; // 클라이언트 입력을 얻습니다. stream datainputStream = new DatainputStream (socket.getInputStream ()); // 클라이언트 출력 가져 오기 스트림 DataOutputStream = 새 DataOutputStream (socket.getOutputStream ()); } catch (ioexception e) {e.printstacktrace (); }} / ** * 클라이언트에게 대량 보내기 (전방) 데이터 * * @author : tuzongxun * @title : sendmessagetoclients * @param @param void * @Date 2016 년 5 월 18 일 5 월 18 일 5 월 18 일. } catch (socketexception e) {} catch (ioexception e) {e.printstacktrace (); }} @override public void run () {isconnect = true; 클라이언트 c = null; try {while (isconnect) {// 클라이언트 문자열로 전달 된 데이터를 읽습니다. System.out.println ( "클라이언트가 말합니다 :" + 메시지); for (int i = 0; i <clients.size (); i ++) {c = clients.get (i); c.sendmessagetoclients (메시지); }}} catch (eofexception e) {system.out.println ( "클라이언트 폐쇄!"); } catch (socketexception e) {if (c! = null) {clients.remove (c); } system.out.println ( "클라이언트가 닫힙니다 !!!"); } catch (예외 e) {e.printstacktrace (); } 마침내 {// 관련 리소스를 닫습니다. {if (datainputStream! = null) {datainputStream.close (); } if ((null) {socket.close (); 소켓 = null; }} catch (ioexception e) {e.printstacktrace (); }}}}}}}}}}}}}}}}}}}}}}먼저 소개 한 다음 새 콘텐츠가 있으면 업데이트하겠습니다.
웹 온라인 채팅 기능 실현과 관련하여 학습을 위해 다음 기사를 참조 할 수도 있습니다.
Java는 간단한 tcpsocket 채팅방 기능 공유를 구현합니다
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. Wulin.com의 더 흥미로운 콘텐츠에 계속주의를 기울일 수 있기를 바랍니다.