이전 기사에서 Java Socket Chat Room 프로그래밍 (1) 소켓을 사용하여 채팅 메시지 푸시를 구현하여 소켓을 사용하여 메시지를 서버와 클라이언트 사이에 전달하여 메시지 푸시 목적을 달성하는 방법에 대해 이야기했습니다. 다음으로 서버가 클라이언트와 클라이언트 간의 통신을 설정할 수있는 방법에 대해 작성하겠습니다.
실제로, 그것은 일대일 채팅 커뮤니케이션을 설정하는 것입니다.
메시지 푸시를 구현 한 이전 코드와 다소 다르며 수정되었습니다.
방법이나 클래스가 언급되지 않은 경우 이전 기사와 정확히 동일합니다.
1. 엔티티 클래스 수정 (서버 및 클라이언트의 엔티티 클래스가 동일합니다)
1. 사용자 인증 사용자 정보 테이블
공개 클래스 userInfobean은 시리얼이즈 가능한 {개인 정적 최종 최종 최종 SerialversionUid = 2L; private long userId; // 사용자 이름 개인 문자열 username; // 닉네임 개인 문자열 userpwd; // 사용자 비밀번호 개인 문자열 usericon; // user avatar // avit get get}2. 메시지 비안 채팅 정보 테이블
공개 클래스 Messagebean은 시리얼이즈 가능 {개인 정적 최종 최종 긴 시리얼 스리틀 오디시 = 1L; 개인 롱 맨 MessageID; // 메시지 idprivate long groupid; // 그룹 메시지 개인 int chattype; // 메시지 유형; 1, 텍스트; 2, 그림; 짧은 비디오; 5, 지리적 위치; 6, 음성 위치; 6, 음성; 콘텐츠 개인 문자열 errormsg; // 오류 메시지 private int errorcode; // 오류 코드 private int userId; // user idprivate int friendid; // target friend idprivate messagefilebean chatfile; // 메시지 첨부 // get and set methods}3. MessageFileBean 메시지 첨부 테이블
공개 클래스 MessageFileBean은 시리얼이즈 가능한 {private static final long serialversionuid = 3L; private int fileId; // file idprivate string filename; // 파일 이름 private long filelength; // 파일 길이 개인 byte [] fileByte; // 파일 개인 문자열 filetype; // 파일 개인 문자열 filetitle; // omit get get get remit get remit get}.2. (서버 측 코드 수정) Chatserver의 기본 채팅 서비스 클래스, 수정
public class chatserver {// socket service private static sperversocket server; // ArrayList를 사용하여 모든 SocketPublic List <socket> socketlist = new arraylist <> (); // 소켓 맵 <Integer, socket> socket> socketmap = new Hashmap (); new hashmap (); hashmap (); public gson = new Gson ();/*** 소켓 서비스 초기화*/public void initserver () {// port 8080 서버에서 고객 요청을 듣기 위해 서버 소켓을 만듭니다. blocke.printstacktrace ();}}/*** 메시지 관리를 만들고 메시지를 계속 수신하고 메시지 수신*/private void createMessage () {try {system.out.println ( "사용자 액세스 대기 :"); // acccept ()를 사용하여 고객 요청 소켓을 대기하여 소켓 소켓 = server.accrect (); // 링크 소켓을 저장합니다. SocketList.Add (Socket); System.out.println ( "사용자 액세스 :" + socket.getport ()); // 다른 소켓을 기다릴 수 있도록 자식 스레드를 열어 새 스레드에 가입 할 때까지 (새로운 runnable () {public void run () {// 다른 사용자가 CreateMessage ()에 액세스하기 위해 다른 사용자를 대기 대기하기 위해 소켓을 생성합니다 (); 클라이언트 bufferedReader bff = new bufferedReader (new inputStreamReader (socket.getInputStream ()); // 서버 정보 문자열을 읽는다. = bff.readline ())! = null) {// 엔티티 클래스 MessageBean = gson.fromjson (line, messagebean.class); // 맵에 사용자 정보를 추가하고 데이터베이스에 모방하고 메모리에 저장되고 소켓이 메모리에 저장됩니다. 사용자 ID는 참조 SetChatMap (MessageBean, Socket)으로 사용됩니다. // 사용자가 보낸 메시지를 대상 친구 GetFriend (MessageBean)로 전달합니다. System.out.println ( "user :" + usermap.get (MessageBean.getUserid ()). getUserName ()); server.close ();} catch (예외 e) {// todo auto-auto-a auto-a auto-kenated catch blocke.printstacktrace (); system.out.println ( "error :" + e.getMessage ());}}/*** 메시지 보내기*/private void getMessage () {new void run () {string bructer; {// 콘솔 strin = new bufferedReader (new inputStreamReader (System.In))에서 BufferEdReader를 입력하십시오 (새 InputStreamReader (System.In)); buffer = strin.Readline (); // readline을 종말점으로 사용하기 때문에 끝 += "/n"; // (SocketeCocket)에 대한 모든 사용자에게 연결된 모든 사용자에게 푸시하도록 수정됩니다. {outputStream output = socket.getOutputStream (); output.write (buffer.getBytes ( "utf-8")); // 데이터 송신 output.flush ();}}} catch (ioexception e) {// to a auto-generated catch.printstacktrace ()}}) 데이터베이스 및 메모리** @param messagebean* @param scoket*/private void setchatmap (messagebean messagebean, socket scoket) {// 사용자 정보를 (usermap! = null && usermap.get (messagebean.getBean.getBean.getBean.getUserid (usermap.put), getUserInfobean (messugebean.getUserid ());} // 해당 연결된 소켓을 저장하면 (socketmap! = null && socketmap.get (messagebean.getuserid ()) == null) {socketmap.put (messagebean.getUserid (), Scoket)/*simulation with withifice with the datebase, simulate simulate with the worly with the terverations, simulate simulate simulate simulate simulate simulate simulate simulate simulate simulate simulate simulate simulate simulate simul. 여기** @param userId* @return*/private userInfobean getUserInfobean (int userId) {userInfobean userInfobean = new userInfobean (); userInfobean.setusericon ( "user Avatar "); userInfobean.setUserId (userId); userInfobean.setUserName ("admin "); userInfobean.setUserPwd ("123123132a "); return userInfobean;}/*** 메시지를 대상 친구에게 전달하십시오** @param messagebean*/private void get friendl (resight -bean). && socketmap.get (messugebean.getfriendid ())! = null) {socket socket = socketmap.get (messagebean.getfriendid ()); 문자열 버퍼 = gson.tojson (messagebean); // readline이 새로운 라인을 갖는 종점이기 때문에 end += "// {// outsput on at output prust에서 새로운 라인 버퍼를 추가하기 때문에 readline이 새로운 라인을 추가합니다. socket.getoutputStream (); output.write (buffer.getBytes ( "utf-8")); // 데이터 송신 output.flush ();} catch (ioexception e) {// todo auto-auto-auto-auto-rected catch blocke.printstacktrace ();}}}}}}}}}}}}}.3. (클라이언트 코드) LoginActivity 로그인 페이지 수정은 여러 사람에게 로그인 할 수 있습니다.
Public Class LoginActivity는 AppComPatactivity를 확장합니다. {private edittext chat_name_text, chat_pwd_text; private button chat_login_btn; @overrideprotected void oncreate (bundle savedinstancestate) {super.oncreate (super.onstancestate); chatout.ctinate (r.layout. = (editText) findViewById (r.id.chat_name_text); chat_pwd_text = (editText) findViewById (r.id.chat_pwd_text); chat_login_btn = (button) findViewById (r.id.chat_login_btn); chat_login_btn.setononclicklistner (new View.onClickListener () {@OverRidePublic void onclick (view v) {int status = getLogin (chat_name_text.getText.getText (). toString (). trim (), chat_pwd_text.getText (). tostring (). trim ()); if (status == || | | | | | | | {토스트 .maketext (loginActivity.this, "password error", toast.length_long) .show (); return;} getchatserver (getLogin (chat_name_text.getText (). tostring (), trim (), chat_pwd_text.gettext (). trimtring ()).) 의도 (loginActivity. this, mainActivity.class); startActivity (의도); finist ();}});}/*** 로그인 상태로 돌아가고 1은 사용자이고 2는 다른 사용자입니다. 여기, 두 사용자는 서로 ** @param name* @param pwd* @return*/private int getLogin (문자열 이름, 문자열 pwd) {if (textUtils.isempty (name) || textUtils.isempty (pwd)) {return 0; // 전체 비밀번호가 입력되지 않음 (name.equals ( "admin)))))))))) 1; // user1} else if (name.equals ( "admin") && pwd.equals ( "2")) {return 2; // user2} else {return -1; // password error}}}/*** 채팅 서비스를 인스턴스화합니다 ** @param status*/private void getchatserver (int status) {chatappliAction.chatser (chatser);4. (클라이언트 코드) 채팅 서버 채팅 서비스 코드 로직 수정
공개 클래스 chatserver {private socket socket; private handler handler; private messagebean messagebean; private gson = new gson (); // 소켓 객체에서 출력 스트림을 가져 와서 printwriter printwriter printwriter; inputStream 입력; outputStream 출력; dataOutputStream dataOutputStream (int status)을 구성합니다. {initMessage (status); initchatserver ();}/*** 메시지 큐, 메시지 전달에 사용됩니다. ** @param handler*/public void setchathandler (handler handler) {this.handler = handler;} private void initchatserver () {// private struch (}/private void intrites)*/private void intrestess (}). {messagebean = new MessageBean (); userInfobean userInfobean = new userInfobean (); userInfobean.setUserId (2); messageBean.setMessageId (1); MessageBean.SetchAttype (1); userInfobean.setuserName ( "admin"); userInfobean.setUserPwd ( "123123123a"); ehoulder exted, extended when a extends a extends a extends a extates a extends a extrates a extress a extress a extress extal 그리고 채팅 대상 사용자 idif (status == 1) {// 사용자 1 인 경우, 그는 사용자 2를 채팅하여 chat messageBean.setUserId (1); wather 2)를 가리 킵니다. messagebean.setfriendid (1);} chatappliaction.userinfobean = userinfobean;}/*** 메시지 보내기 ** @param contentmsg*/public void sendMessage (string contentmsg) {try (socket = inull) {worth emsage = handler.obtainmessage (); whert = 1; close "; handler.sendmessage (message); return;} byte [] str = contentmsg.getBytes ("utf-8 "); // 컨텐츠를 utf-8string aaa = new String (str)으로 변환합니다. MessageBean.setContent (aaa); String MessageJson = gson.tojson (messag "/n"; output.write(messagejson.getBytes("utf-8")) ;// 인쇄 output.flush (); // 서버가 즉시 문자열을 수신하도록 출력 스트림을 새로 고침} catch (Exception e) {e.printstacktrace (); log.e ( "test", "error :" + e.toString ());}}/*** 메시지를 받고 자식 스레드를 받고*/private void arcevemessage () {new Runnable () {@Overridepoblic void run () {@Overrideppublic void run (). 기본 포트 8080 소켓에 대한 클라이언트 요청 = 새로운 소켓 (Socketurls.IP, SocketUrls.port); // 소켓 객체에서 입력 스트림을 가져 와서 해당 버퍼드 리더 객체 인쇄기 (socket.getOutputStream ()); input = socket.getInputStream (outout = socket.getoutStream = getoutStream (); DataOutputStream (socket.getOutputStream ()); // 클라이언트 버퍼드 리더 BFF에서 정보 가져옵니다. 새로운 bufferedReader (inputStreamReader (input)); // SERVER 정보 문자열을 읽습니다. while (true); + line); messagebean messagebean = gson.fromjson (line, messagebean.class); message message = handler.obtainMessage (); messag input.close (); // 소켓 입력 스트림 socket.close (); // socket} catch (예외 e) {e.printstacktrace (); log.e ( "test", "error :" + e.toString ());}}). public socket getSocekt () {null) {null); 소켓;}}}이러한 방식으로 코드 로직은 메시지의 논리에서 단일 채팅의 논리로 수정되었습니다.
이 코드를 사용하면 사용자 1과 사용자 2가 서로 채팅 할 수 있으며 서버는 채팅 기록을 기록합니다. 서버는 또한 메시지 푸시 기능을 가지고 있습니다.
위의 것은 편집기가 소개하여 소켓을 사용하여 단일 채팅방을 구현하기 위해 소개 한 Java Socket Chat Room 프로그래밍입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!