В предыдущей статье программирования чата Java Socket (1) с использованием сокета для реализации толкания сообщений чата мы говорили о том, как использовать сокет для того, чтобы сообщения проходить между сервером и клиентом для достижения цели разжигания сообщений. Далее я напишу о том, как включить сервер установить связь между клиентом и клиентом.
На самом деле, это создание общения в чате один на один.
Это несколько отличается от предыдущего кода, который реализовал толчок сообщения, и он был изменен на нем.
Если методы или классы не упоминаются, они точно такие же, как в предыдущей статье.
1. Измените класс объектов (класс объектов на сервере и клиенте одинаково)
1. Таблица информации пользователя userinfobean
открытый класс userInfobean реализует serializable {private static final long serialversionuid = 2l; private long userid; // идентификатор пользователя string username; // имя пользователя частная строка Связан; // chicname private string userpwd; // Пользовательский пароль private usericon; // avatar пользователя // Опустить и установить методы}2. Таблица информации о чате сообщения
Общедоступный класс Blase Reculsings Serializable {Private Static Long Long SerialVersionUID = 1L; Private Long MessageId; // Идентификатор сообщений Long GroupId; // IDPrivate IdPrivate Boolean Isgoup; // Будь то групповое сообщение Private Int Catttype; // Тип сообщения; 1, текст; 2, изображение; 3, короткое видео; 4, файл. Контент Private String errorrormsg; // Сообщение об ошибке private int errorcode; // код ошибки private int userId; // идентификатор пользователя int wrothyId; // Target Friend IdPrivate MessageFilebean Chatfile; // Приложение сообщения // Опустить методы get и set}}}}}}}}}}}}}}}}}}}3. Таблица вложения сообщения сообщений сообщений
Общедоступный класс.
2. (Модификация кода на стороне сервера) Основной класс службы чата чата, модифицированный
Общедоступный класс CHATServer {// Socket Service Private Static Serversocket Server; // Использование ArrayList для хранения всех сокетов -списков <socket> socketList = new ArrayList <> (); // имитировать карту SocketPublic <Integer, Socket> SocketMap = new Hashmap (); // IMIT Hashmap (); public gson gson = new gson ();/*** инициализировать службу сокета*/public void initserver () {try {// Создать Serversocke для прослушивания запросов клиента на порте 8080 Server = New Serversocket (SocketUrls.port); blocke.printstacktrace ();}}/*** Создать управление сообщениями и продолжать получать сообщения*/private void createmessage () {try {System.out.println («Ожидание доступа пользователя:»); // Использование Accept () для блокировки ожидания запроса клиента сокета = сервер. socketlist.add (socket); system.out.println ("user access:" + socket.getport ()); // Откройте детскую поток, чтобы дождаться, пока другой сокет присоединится к новому потоку (новый runnable () {public void run () {// Создать сервис сокета, снова ожидающий, чтобы другие пользователи могли получить доступ к CreateMessage ();) Информация из клиента BufferedReader BFF = New BufferedReader (New InputStreamReader (socket.getInputStream ())); // Читать информацию о посланном сервере строки = null; // цикл для получения сообщений от текущего сокета, в то время как (true) {thread.sleep (500); // System.out.println ("Content:" + bff.); bff.readline ())! = null) {// parse the Messagebeans Blebeans Blebeans Blebean = gson.fromjson (line, messagebean.class); // Добавить информацию в карту, имитируйте ее в базу данных, а память // класс объектов хранится в базе данных, а сокет хранится в памяти. Идентификатор пользователя используется в качестве эталонного SetChatMap (BesseNshean, Socket); // Пересекать сообщение, отправленное пользователем, целевому другу Get Friend (MessageBean); System.out.println («Пользователь:» + usermap.get (messagebean.getUserid ()). Getusername ()); System.out.println ("Содержимое:" + Messagebean.getBean.GetName); Server.close ();} Catch (Exception e) {// todo автоматически сгенерированный catch blocke.printstacktrace (); System.out.println ("error:" + e.getmessage ());}}/*** Отправить сообщение*/private void getMessage () {new Runnable () {public void run () {trane bufface {trane void run () {trane runer run (). {// Введите BufferedReader из консоли Strin = New BufferedReader (New InputStreamReader (System.in); Buffer = strin.Readline (); // Поскольку чтение использует новую линию в качестве конечной точки, добавьте новый буфер в конце += "/n"; // Здесь он модифицирован для толкания всех пользователей, подключенных к серверу (SocketSockeMap: velueMap. socket.getOutputStream();output.write(buffer.getBytes("utf-8"));// Send data output.flush();}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}/*** Simulate adding information to the database and memory* * @param Bessebean* @param Scoket*/private void setchatmap (besembean beanse, socket scoket) {// Сохранить информацию пользователя, если (usermap! = null && usermap.get (messagebean.getuserid ()) == null) {usermap.put (messagebean.getuserid (),) == null) {usermap.put (messagebean.getUserid (),) == null) {usermap. getUserinfobean (messagebean.getUserid ()));} // Сохранить соответствующий связанный сокет if (socketmap! = null && socketmap.get (messagebean.getuserid ()) == null) {socketmap.put (messagebean.getuserid (), scoket); Здесь** @param userid* @return*/private userinfobean getUserinfobean (int userId) {userInfobean userInfobean = new userInfobean (); userInfobean.setUseRicon ("Пользователь Avatar "); userinfobean.setuserid (userId); userInfobean.setUsername (" admin "); userInfobean.setUserpwd (" 123123132a "); return userInfobean;}/*** Перемесить сообщение на целевой друг** @param message*/private void get frifiu && socketmap.get (messageBean.getFriendId ())! = NULL) {Socket Socket = SocketMap.get (MessageBean.getFriendId ()); String Buffer = gson.tojson (Bessagebean); // Потому что чтения - это конечная точка с новой строкой, добавить новый буфер на конце += "/n"; tryline {// witned witper witper = jeply witper witper = "// wited witper witper =" // jed aeplecteam = "// words witper witper witpream =" // wordse witper witper witpream = "// wited witple socket.getOutputStream (); output.write (buffer.getbytes ("utf-8")); // Отправить data output.flush ();} catch (ioexception e) {// todo автоматически сгенерированный слок.3. (Клиентский код) Изменение страницы страницы логина может войти в систему для нескольких человек
открытый класс loginActivity extends appcompatactivity {private edittext CHAT_NAME_TEXT, CHAT_PWD_TEXT; Private COTTICE_LOGIN_BTN; @OverrideProtected void onCreate (Bundle SavedInStancestate) {super.oncreate (savedInStanceTate); setContentView (r.layaUtaUtaint.Aatcete_logIn; (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.setOnClickListener(new View.OnClickListener() {@OverridePublic void onClick (view v) {int status = getLogin (CHAT_NAME_TEXT.getText (). ToString (). Trim (), CHAT_PWD_TEXT.GetText (). TOSTRING (). TRIMP (); if (status = -1 || status = 0) {toast.maketexxt (loginatctips. Toast.length_long) .show (); return;} getChatserver (getLogin (CHAT_NAME_Text.getText (). ToString (). Trim (), Chat_pwd_text.getText (). ToString (). Trim ()); намерение = new Intence (). Это MainActivity.class); startActivity (intent); finish ();}});}/*** вернуть в состояние входа в систему, 1 является пользователем, а 2 - другой пользователь. Здесь два пользователя смоделированы, чтобы общаться друг с другом ** @param name* @param pwd* @return*/private int getLogin (string name, string pwd) {if (textutils.isempty (имя) || textutils.isempty (pwd)) {return 0; // не введен полный пароль} else (name.equals ("adding"). 1; // user1} else if (name.equals ("admin") && pwd.equals ("2")) {return 2; // user2} else {return -1; // ошибка пароля}}/*** instantiate a Chat ** @param*/private void getChatserver (int) {chatappliaction.chatserver = new.);4. (Клиентский код) Изменение логики кода службы чата чата
Общедоступный класс чаттервер {частный сокет; {initmessage (status); initchatserver ();}/*** Очередь сообщений, используемая для передачи сообщений ** @param Handler*/public void setchathandler (Handler Handler) {this.handler = Handler;} private void initchaterver () {// Открыть поток {messageBean = new MessageBean (); userInfobean userInfobean = new Userinfobean (); userinfobean.setuserid (2); messagebean.setmessageid (1); messagebean.setchattype (1); userinfobean.setusernam и целевой пользователь THAT IDIF (status == 1) {// Если это пользователь 1, то он указывает на пользователя 2 на чат -bean.setUserid (1); messagebean.setfriendiD (2);} else if (status == 2) {// Если это пользователь 2, то он укажет на пользователь 1 на сообщение в чате. SeploSerid (2); MessageBean.SetFriendId (1);} ChatAppliAction.userInfobean = userInfobean;}/*** Отправить сообщение ** @param contentmsg*/public void sendmessage (String contentmsg) {try {if (socket == null) {Сообщение = Handler.obteanMessage (); закрыто "; Handler.sendMessage (сообщение); return;} byte [] str = contentmsg.getbytes (" utf-8 "); // конвертировать содержимое в UTF-8String aaa = new String (str); messagebean.setContent (aaa); string messagejson = gson.tojson (bessebean);/*** Поскольку readline () на сервере блокирует чтение* Если он не может считывать символ новой линии или выходной поток, оно будет заблокировано там*, так что новая линия добавляется в конце сообщения JSON, чтобы сообщить о сервере, что сообщение было отправлено***/MessageJson += = = = = = = "/n"; Output.write(messagejson.getbytes("utf-8"); ;// print woutput output.flush (); // Обновить выходной поток, так что сервер сразу же получает строку} Catch (Exception e) {e.printStackTrace (); log.e ("test", "error:" + e.toString ());}}/*** Запрос клиента на натуральный порт 8080 Socket = New Socket (socketUrls.ip, socketurls.port); // Получить поток ввода из объекта сокета и построить соответствующий объект BufferedReader PrintWriter = new PrintWriter (socket.getOutputStream ()); input.getInputStream (); output = socketOutputStream (); DataOutputStream (socket.getOutputStream ()); // Получить информацию из клиента BufferedReader BFF = New BufferedReader (New InputStreamReader (Input)); // Читать линию информации о отправке сервера; line);MessageBean messageBean = gson.fromJson(line, MessageBean.class);Message message = handler.obtainMessage();message.obj = messageBean.getContent();message.what = 1;handler.sendMessage(message);}if (socket == null)break;}output.close();//Close Socket output stream input.close();//Close Socket input stream socket.close (); // закрыть сокет} catch (Exception e) {e.printstacktrace (); log.e ("test", "error:" + e.toString ());}}}). start ();} public socket getSocekt () {if socket = null) return; return Socket;Таким образом, логика кода была изменена из логики толкания сообщений к логике отдельного чата.
Этот код позволяет пользователю 1 и пользователю 2 общаться друг с другом, и сервер будет записывать историю чата между ними. И сервер также имеет функцию push.
Выше приведено программирование чата Java Socket, представленное вам редактором (II) с использованием сокета для реализации одной чата. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!