Связанное чтение: программирование чата Java Socket (ii) с использованием сокета для реализации отдельного чата.
Уже есть много примеров использования сокетов для реализации чата в Интернете, но я видел много из них, и есть более или менее проблем.
Здесь я буду реализовать относительно полный пример чата и объясню в нем логику.
Поскольку розетка относительно большая, я разделим несколько статей, чтобы написать относительно полный пример розетки.
Здесь мы сначала реализуем самую простую функцию связи сервера-клиента и клиента, чтобы реализовать толчок сообщения.
Цель: Сервер устанавливает соединение с клиентом. Клиент может отправлять сообщения на сервер, а сервер может доставлять сообщения клиенту.
1. Создайте сервер чата сокета с помощью Java
1. SocketUrls определяет IP -адрес и номер порта
открытый класс SocketUrls {// IP -адрес public final Static String IP = "192.168.1.110"; // номер порта публичный окончательный статический int port = 8888;}2. Вход в основную программу
открытый класс main {public static void main (string [] args) бросает исключение {new ChatServer (). initServer ();}}3. класс бобовых сущностей
Userinfobean
открытый класс main {public static void main (string [] args) бросает исключение {new ChatServer (). initServer ();}}Чат Бланки
Общедоступный класс blesemends Extends userInfobean {private long messageId; // Идентификатор сообщений Long GrougID; // IDPrivate BOOLEAN ISGOUP; // Будь то групповое сообщение private int CattType; // Тип сообщения; 1, текст; 2, изображение; 3, короткое видео; 4, файл; 5, географическое местоположение; 6, голосовое сообщение; 7, Video Call Private Stress Content;// текстовое сообщение;// текстовое сообщение; ERRORCODE; // Код ошибки // Опустить метод get/set}4. Служба чата в чате, самая важная программа
Общедоступный Catserver {// Socket Service Private Static Serversocket Server; public gson gson = new gson ();/*** инициализировать службу сокета*/public void initServer () {try {// Создать серверскете для прослушивания запросов клиентов на порт 8080 Server = New Serversocket (SocketUrls.port); Автопогенерированный catch blocke.printstacktrace ();}}/*** Создать управление сообщениями и продолжать получать сообщения*/private void createmessage () {try {system.out.println («Ожидание доступа пользователя:»); // Использование Accept () для блокировки и ожидания клиентских запросов Socket Socket = Accep (); System.out.Print.print.print.print.print.print.print.print.print.print.print.print (user except. socket.getport ()); // Откройте детскую ветку, чтобы подождать, пока другой сокет присоединится к New Thread (new Runnable () {public void run () {createMessage ();}}). start (); // Отправить информацию в клиент outputStream output = socket.getOutputStream (); // Получить информацию из клиентского BufferedRead Bff = new Bufferread (new InputStreamReader (socket.getInputStream ())); // Scanner Scanner = New Scanner (socket.getInputStream ()); new Thread (new Runnable () {public void run () {try {String Buffer; while (true) {// Ввод BufferedReard из BuffereRER); strin.readline (); // Поскольку Rideline использует новую линию в качестве конечной точки, добавьте буфер Newline в конце += "/n"; Output.write(buffer.getbytes("utf-8");/// Send Data output.flush ();}} Catch (ioException e) {// todo auto-cearm. blocke.printStackTrace();}}}).start();// Read the sent server information String line = null;// The loop keeps receiving messages from the current socket while (true) {Thread.sleep(500);// System.out.println("Content: " + bff.readLine());// Get the client's information while ((line = bff.readLine()) != null) {Messagebean bessebean = gson.fromjson (line, messagebean.class); system.out.println ("user:" + messagebean.getusername ()); system.out.println ("Содержание:" + messagebean.getContent ());} // server.clase (); blocke.printstacktrace (); system.out.println ("error:" + e.getmessage ());}}}2. Сторона Android используется в качестве мобильной стороны для подключения к серверу
1. Appliaction создает глобальную службу чата
открытый класс ChatAppliAction Extends Application {public Static Catserver Chatserver; Public Static UserInfobean userInfobean; @OverridePublic void onCreate () {super.Oncreate ();}}2. IP -адрес и номер порта соответствуют серверу
3. Сила чата такая же, как и на стороне сервера
4. XML Mayout. Войдите, чат
1. Войдите в систему
<? xml version = "1.0" Encoding = "UTF-8"?> <linearlayout xmlns: android = "http://schemas.android.com/apk/res/android" Android: Layout_width = "match_parent" Android: Layout_height = "match_pa Аренда "Android: Orientation =" vertical "> <editTextAndroid: id ="@+id/cat_name_text "Android: Layout_width =" match_parent "Android: Layou t_height = "wrap_content" Android: hint = "username" Android: Text = "Admin"/> <EditTextAndroid: id = "@+id/chat_pwd_text" Android: layout_width = " match_parent "android: layout_height =" wrap_content "Android: hint =" пароль "Android: Text =" 123123123a "Android: inputtype =" NumberPassword " /> <Buttonandroid: id = "@+id/chat_login_btn" Android: layout_width = "match_parent" Android: layout_height = "wrap_content" Android: hint = "login"/> </linearlayout>
2. чат
<? xml version = "1.0" Encoding = "UTF-8"?> <linearlayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" Android: layout_width = "match_parent" android: layout_height = "match_parent" Android: orientation = «Вертикальные« Инструменты: context = ». Activity.mainactivity»> <scrollViewAndroid: id = "@+id/scrollview" Android: layout_width = "match_parent" Android: Layout_height = "0dp" Android: Layout_weight = "0.9"> <linearlayoutandr OID: id = "@+id/cat_ly" Android: layout_width = "match_parent" Android: layout_height = "match_parent" Android: Orientation = "vertical"> </linearlayout> </scrollview> <linearlayoutandroid: layout_width = "match_par ENT "Android: Mayout_height =" wrap_content "Android: Orientation =" Horizontal "> <EditTextAndroid: ID ="@+ID/CHAT_ET "Android: Layout_width =" 0DP "Android: Layout_Height =" match_paren /><buttonAndroid:id="@+id/send_btn"Android:layout_width="0dp" закончился
5. LoginActivity Login
открытый класс 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) {if (getLogin (cat_name_text.getText (). ToString (). Trim (), chat_pwd_text.getText (). ToString (). Trim ()) {getChatserver (); MainActivity.class); startActivity (intent); finish ();}}});} частное ловятное звание getLogin (string name, string pwd) {if (textutils.isempty (имя) || textutils.isempty (pwd)) return false; if (name.equals ("admin") && pwd. ("12312333 false;} private void getChatserver () {chatappliaction.chatserver = new Chatserver ();}}6. Главный чат
открытый класс MainActivity Extends AppCompAtactivity {private linearlayout cat_ly; private textView Lealth_text, right_view; private edittext cat_et; private button send_btn; private viewgroup.layoutparams layoutparams = new viewgroup.layoutparams (viewgroup.layoutparams.match_parent,, viewgroup.layoutparams (viewgroup.layoutparams. Viewgroup.layoutparams.wrap_content);@overdeproted void oncreate (bundle savedInstanceState) {super.oncreate (savedInstanceState); setContentView (r.layout.activity_main); cath_ly = (linearlayout) findviewb findViewById (r.id.chat_et); send_btn = (кнопка) findviewbyid (r.id.send_btn); send_btn.setonclicklistener (new view.onclicklistener () {@overridepublic void Onclick (view v) {Chatappliaction.chatserver.sendmessage (CHAT_ET.GetText (). TOSTRING (). TRIM ()); CHAT_LY.Addview (initrightView (CHAT_ET.GetText (). TOSTRING (). TRIM ());}}); // Добавить сообщение QueUeChatAppliAction.ChatsLver. {@OverridePublic void handlemessage (сообщение msg) {if (msg.what == 1) {// после отправки обратного сообщения, обновление uichat_ly.addview (initleftview (msg.obj.tostring ());}}});}/** Сообщение о правильном*@param*aterright*at itrentright*at aterviltent* @aterviltent*at intorriltent*at intorrigt*}}}}}}}});};}/** MessageContent) {right_view = new TextView (this); right_view.setLayoutparams (layoutparams); right_view.setgravity (view.focus_right); right_view.settext (messagecontent); return right_view;}/** Сообщение на левом*@Par MessageContent) {Lealth_Text = new TextView (this); LEATE_TEXT.SetLayoutParams (LAYOUTPARAMS); LEATE_TEXT.SETGRAVITY (view.focus_left); Lealth_text.settext (messageContent); return Lealth_text;}};7. Логика чата чата, самая важная
Общедоступный класс CHATServer {Private Socket Socket; Private Handler; // Получить выходной поток из объекта сокета и построить объект PrintWriter Printwriter; inputStream Input; outputStream; DataOutputStream DataOutputeReam; publicatserver () {initMess ();); Очередь, используемая для передачи сообщений ** @param Handler*/public void setchathandler (обработчик обработчика) {this.handler = handler;} private void initchatserver () {// Открыть поток для получения сообщения сообщений ();}/*** Инициализировать информацию пользователя*/private void initmessage () {messagebean = new MessageBean (); MessageBean.SetUSERID (1);; MessageBean.SetMessAgeId (1); MessageBean.SetchAttype (1); MessageBean.SetUserNam null) {Сообщение сообщения = handler.obtainmessage (); message.what = 1; message.obj = "Сервер был закрыт"; Handler.sendmessage (Message); return;} byte [] str = contentmsg.getbytes ("utf-8"); // поворот контент utf-8String aaa = new Slind (str); gson.tojson (bynebean);/*** Поскольку readline () на сервере блокирует чтение* Если он не может прочитать персонаж Newline или вывод поток, он будет заблокирован там*, так что в конце сообщества JSON будет добавлен новый персонаж. print 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 (); DateOutputStream (socket.getOutputStream ()); // Получить информацию из клиента BufferedReader BFF = New BufferedReader (New InputStreamReader (Input)); // Читать линию информации о отправке сервера; Сообщение сообщений = handler.obtainmessage (); message.obj = line; message.what = 1; handler.sendmessage (message);} if (socket == null) разрыв;} output.close (); // Закрепите вывод Socket Specpt.close (); // Закрепите входной поток. {e.printstacktrace (); log.e ("test", "error:" + e.toString ());}}}). start ();}}}Кстати, весь код был завершен.
Эта демонстрация может позволить мобильному телефону отправлять сообщения на сервер и сервер на мобильный телефон.
Эта демонстрация может рассматриваться как функция толчка, но реальный толчок не так просто. Как новичок в сокетах, вы можете увидеть идеи программирования сокетов.
Выше приведено программирование чата Java Socket, представленное редактором (1) для использования сокета для реализации толчка сообщения чата. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!