나는 최근에 유휴 상태였으며 일부 Java 기술 응용 프로그램을 검토하는 데 시간이 걸렸습니다.
나는 오늘 할 일이 없다. UDP 프로토콜을 기반으로 매우 간단한 대화방 프로그램을 작성했습니다.
현재 작업에서 소켓은 거의 사용되지 않으며 이는 Java 네트워크 프로그래밍의 간단한 메모리이기도합니다.
효과를 살펴 보겠습니다.
구현의 효과는 매우 간단하다고 말할 수 있지만 여전히 구현 원칙을 볼 수 있습니다.
"채팅실 001", Xiaohong과 Xiaolu의 사용자는 몇 마디로 서로 대화를 나 and으며 "채팅실 002"의 Xiaohei는 그를 무시하고 외로웠습니다.
코드 구현을 살펴보십시오.
1. 우선, 메시지 서버의 구현은 기능이 매우 간단합니다.
• 고객의 정보 (입력 한 채팅방 등)를 등록합니다.
• UDP 프로토콜 소켓 개체를 구성하여 각 클라이언트가 보낸 메시지를 수락합니다.
• 메시지 내용을 분석하고 채팅 정보를 해당 대화방의 각 클라이언트에게 다시 밀어 넣습니다.
package com.tsr.simplechat.receive_server; import java.io.ioexcept; import java.net.datagrampacket; import java.net.datagramsocket; import java.net.socketexception; import java.util.arraylist; import java.util.util.hashmap; import com.goole.gson com.tsr.simplechat.bean.messageentity; import com.tsr.simplechat.client.chatclient; // 채팅 서버 공개 클래스 채팅 서버 스레드 확장 {// 프로그램은 포트 번호 개인 정적 최종 포트 = 10000을 차지합니다. // 메시지가 소켓 객체를 수락 개인 정적 데이터 그램 소켓 서버 = null; // 사전 객체 (키 : 채팅방 ID, 값 :이 대화방의 클라이언트 사용자 세트); private static hashmap <string, arraylist <chatclient >> groups = new Hashmap <String, ArrayList <chatclient >> (); // 생성자 public Chatserver () {try {// 메시지는 소켓 객체 서버의 구성 초기화를 수락합니다. } catch (socketexception e) {e.printstacktrace (); }} // 채팅방에 새 로그인 사용자를 등록 공개 정적 무효 로그 그룹 (String GroupId, ChatClient Client) {// 채팅 룸 ArrayList <CatClient> Clients.get (GroupId)를 통해 채팅방의 모든 온라인 사용자를 얻습니다. if (clients == null) {clients = new ArrayList <CatClient> (); } // 이번에는 채팅방에 입력 한 사용자를 이번에는 clients.add (client); // 채팅방 정보 그룹 업데이트. } // 메시지 수신 @override public void run () {while (true) {cheriveMessage (); }} private void HeagiveMessage () {// udp packet byte [] buf = new Byte [1024]; Datagrampacket Packet = 새로운 Datagrampacket (buf, buf.length); while (true) {try {// packet server.receive (패킷); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } // 데이터 패킷을 구문 분석하고 채팅 정보를 얻습니다. 정보 문자열 content = new String (packet.getData (), 0, packet.getLength ()); // 타사 패키지 GSON GSON = New GSON ()을 통한 JSON 데이터를 구문 분석합니다. messageentity me = gson.fromjson (내용, messageentity.class); // 메시지 내용을 구문 분석하고 채팅방 ID ArrayList <CatClient> Clients = Groups.get (me.getGroupId ())을 통해 채팅방의 모든 온라인 사용자를 얻습니다. // 수신 된 메시지를 채팅방의 각 사용자에게 다시 밀어 넣습니다. }}}}2. 클라이언트 프로그램은 여전히 매우 간단합니다.
• 클라이언트 채팅 룸 인터페이스를 간단하게 정의합니다.
• 메시지 보내기 소켓 객체를 구성하십시오.
• 채팅 정보 상자의 내용을 가져 와서 서버로 보냅니다.
패키지 com.tsr.simplechat.client; import java.awt.button; import java.awt.event; import java.awt.frame; import java.awt.textArea; import java.awt.textfield; import java.awt.event.windowadapter; java.awt.event.windowevent; java.io.ioexception; import java.net.datagrampacket; import java.net.datagramsocket; import java.net.inetaddress; import java.net.socketexception; import java.net.unknownhostexception; import com.tsr.simplechat.bean.messageentity; import; com.tsr.simplechat.receive_server.chatserver; // 클라이언트 프로그램 공개 클래스 chatclient 확장 프레임 {private static final long serialversionuid = 1l; // 채팅방 ID 비공개 문자열 GroupId; // 클라이언트 사용자 이름 개인 문자열 clientName; // 클라이언트 메시지 보내기 서비스 소켓 개인 데이터 그램 소켓 MSG_SEND; // 서비스 포트 개인 최종 int 포트 = 10000; // 서버 IP 주소 private inetAddress IP; // 클라이언트 제어 텍스트 필드 tf = New Textfield (20); TextRea ta = new TextRea (); 버튼 보내기 = 새 버튼 ( "보내기"); // 클라이언트 생성자 public ChatClient (String GroupId, String ClientName) {super ( "채팅방 :" + groupId + "/" + clientName); this.clientName = clientName; this.groupid = groupId; // 클라이언트 인터페이스 스타일을 설정합니다 ( "North", Tf); 추가 ( "Center", ta); 추가 ( "South", Send); setsize (250, 250); 보여주다(); // 채팅 관련 서버에 대해 init () 초기화; // AddWindowListener (새 WindowAdapter () {public void WindowClosing (WindowEvent e) {// 서비스 보내기 메시지를 닫습니다 msg_send.close (); // 클라이언트 프로그램 dispose (); system.exit (0);}}); } // private void init () 초기화 init () {// 현재 사용자 및 채팅방 정보를 서버 chatserver.logingroup에 등록 (GroupId, this); 시도 {// 메시지 보내기 소켓 객체 msg_send = new Datagramsocket (); // 메시지 서버를 지정하십시오 {ip = inetAddress.getByName ( "127.0.0.1"); } catch (unknownHostException e) {System.out.println ( "UnknownHostException .."); }} catch (socketexception e) {system.out.println ( "소켓 연결 예외 .."); }} // 메시지 보내기 버튼 시간 공개 부울 액션 중청 // 메시지 보내기 send_message (content); // 채팅 상자를 클리어 tf.settext (null); } catch (예외 ioe) {system.out.print (ioe.getMessage ()); }} true를 반환합니다. } // 메시지 보내기 메시지 개인 void send_message (String content) {// message format (json format) string message = messageformat (content); // 메시지를 UDP 패킷 바이트로 캡슐화합니다 [] buf = message.getBytes (); Datagrampacket Packet = 새로운 Datagrampacket (buf, buf.length, ip, port); {// 메시지를 보내십시오 msg_send.send (packet); } catch (ioException e) {System.out.println ( "io Exception .."); }} // 메시지 서식 개인 문자열 messageformat (String content) {StringBuffer buffer = new StringBuffer (); buffer.append ( "{/"groupId/":"). Append ( "/" "). Append (GroupId) .append ("/","); buffer.append ( "/"username/":/"). Append (clientName) .append ( "/", "); buffer.Append ("/"text/":/"). Append (content) .append ("/"}"); return buffer.toString (); } // 서버에서 현재 채팅방의 최신 뉴스를 얻습니다 (콜백 ..) 공개 void PurpbackMessage (MessageEntity me) {ta.append (me.getusername () + ":" + me.getText ()); ta.append ( "/n"); }} 3. 메시지 엔티티 클래스 <br /> 주로 채팅방 ID, 메시지 발신자 별명 및 메시지 내용을 포함하여 메시지를 객체로 캡슐화하는 데 사용됩니다. JSON 형식을 사용하여 구문 분석하십시오.
패키지 com.tsr.simplechat.bean; // 메시지 엔티티 공개 클래스 MessageEntity {private String groupId; 개인 문자열 사용자 이름; 개인 문자열 텍스트; 공개 문자열 getGroupId () {return groupId; } public void setGroupId (String GroupId) {this.groupId = groupId; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getText () {return 텍스트; } public void setText (문자열 텍스트) {this.text = 텍스트; }}4. 좋아, 기본적으로 여기에서 수행되며 테스트 클래스를 만듭니다.
• 메시지 서버를 켭니다.
• 세 명의 클라이언트를 열고 그 중 2 개는 "채팅실 001"을 입력하고 다른 하나는 "채팅실 002"를 입력합니다.
import com.tsr.simplechat.client.chatclient; import com.tsr.simplechat.receive_server.chatserver; public class test {public static void main (String [] args) {Chatserver r = new Chatserver (); r.start (); chatclient c1 = new ChatClient ( "001", "Little Red"); chatclient c2 = new ChatClient ( "001", "Little Green"); chatclient c3 = new ChatClient ( "002", "Little Black"); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.