温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android如何实现简单C/S聊天室应用

发布时间:2021-04-16 11:11:54 来源:亿速云 阅读:186 作者:小新 栏目:移动开发

这篇文章主要介绍了Android如何实现简单C/S聊天室应用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体内容如下

服务器端:提供两个类

创建ServerSocket监听的主类:MyServer.java

负责处理每个Socket通信的线程类:ServerThread.java

客户端:是一个Android应用程序

==>MultiThreadClient

界面提供两个文本框和一个发送按钮

Activity通过Handler来处理来自子线程的消息

客户端需要一个子线程负责读取来自网络的数据

项目效果:

Android如何实现简单C/S聊天室应用

服务器端代码:

MyServer.java

import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;     public class MyServer {  //定义保存所有Socket的ArrayList  public static ArrayList<Socket> socketList   = new ArrayList<Socket>();   public static void main(String[] args)   throws IOException   {     ServerSocket ss = new ServerSocket(8000);  while(true)  {   //此行代码会阻塞,将一直等待别人的连接   Socket s = ss.accept();   socketList.add(s);   //每当客户端连接后启动一条ServerThread线程为该客户端服务   new Thread(new ServerThread(s)).start(); }

ServerThrad.java

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket;       //负责处理每个线程通信的线程类 public class ServerThread implements Runnable  {  //定义当前线程所处理的Socket  Socket s = null;  //该线程所处理的Socket所对应的输入流  BufferedReader br = null;  public ServerThread(Socket s)  throws IOException  {  this.s = s;  //初始化该Socket对应的输入流  br = new BufferedReader(new InputStreamReader(   s.getInputStream() , "utf-8"));  //②  }  public void run()  {  try  {   String content = null;   //采用循环不断从Socket中读取客户端发送过来的数据   while ((content = readFromClient()) != null)   {   //遍历socketList中的每个Socket,   //将读到的内容向每个Socket发送一次   for (Socket s : MyServer.socketList)   {    OutputStream os = s.getOutputStream();    os.write((content + "\n").getBytes("utf-8"));   }   }  }  catch (IOException e)  {   e.printStackTrace();  }  }  //定义读取客户端数据的方法  private String readFromClient()  {  try  {   return br.readLine();   }  //如果捕捉到异常,表明该Socket对应的客户端已经关闭  catch (IOException e)  {   //删除该Socket。   MyServer.socketList.remove(s);  //①  }  return null;  } }

客户端代码:

布局文件:main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  > <LinearLayout   android:orientation="horizontal"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  > <!-- 定义一个文本框,它用于接受用户的输入 --> <EditText  android:id="@+id/input"   android:layout_width="240px"   android:layout_height="wrap_content"   /> <Button  android:id="@+id/send"   android:layout_width="fill_parent"   android:layout_height="wrap_content"   android:paddingLeft="8px"  android:text="@string/send"  /> </LinearLayout> <!-- 定义一个文本框,它用于显示来自服务器的信息 --> <EditText  android:id="@+id/show"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   android:gravity="top"  android:editable="false"   android:cursorVisible="false"   /> </LinearLayout>

Activity文件:MultiThreadClient.java

package org.wwj.net;   import java.io.OutputStream; import java.net.Socket;   import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText;   public class MultiThreadClient extends Activity {  // 定义界面上的两个文本框  EditText input, show;  // 定义界面上的一个按钮  Button send;  OutputStream os;  Handler handler;    @Override  public void onCreate(Bundle savedInstanceState)  {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  input = (EditText) findViewById(R.id.input);  send = (Button) findViewById(R.id.send);  show = (EditText) findViewById(R.id.show);  Socket s;  handler = new Handler()  {   @Override   public void handleMessage(Message msg)   {   // 如果消息来自于子线程   if (msg.what == 0x123)   {    // 将读取的内容追加显示在文本框中    show.append("\n" + msg.obj.toString());   }   }  };  try  {   s = new Socket("183.30.181.228 ", 8000);   // 客户端启动ClientThread线程不断读取来自服务器的数据   new Thread(new ClientThread(s, handler)).start(); // ①   os = s.getOutputStream();  }  catch (Exception e)  {   e.printStackTrace();  }  send.setOnClickListener(new OnClickListener()  {   @Override   public void onClick(View v)   {   try   {    // 将用户在文本框内输入的内容写入网络    os.write((input.getText().toString() + "\r\n")    .getBytes("utf-8"));    // 清空input文本框    input.setText("");   }   catch (Exception e)   {    e.printStackTrace();   }   }  });  } }

子线程类:ClientThread.java

package org.wwj.net;   import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket;   import android.os.Handler; import android.os.Message;   public class ClientThread implements Runnable {  //该线程负责处理的Socket  private Socket s;  private Handler handler;  //该线程所处理的Socket所对应的输入流  BufferedReader br = null;  public ClientThread(Socket s , Handler handler)  throws IOException  {  this.s = s;  this.handler = handler;  br = new BufferedReader(   new InputStreamReader(s.getInputStream()));  }  public void run()  {  try  {   String content = null;   //不断读取Socket输入流中的内容。   while ((content = br.readLine()) != null)   {   // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据   Message msg = new Message();   msg.what = 0x123;   msg.obj = content;   handler.sendMessage(msg);   }  }  catch (Exception e)  {   e.printStackTrace();  }  } }

感谢你能够认真阅读完这篇文章,希望小编分享的“Android如何实现简单C/S聊天室应用”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI