Android的网络应用 - 简单的C/S聊天室
2012-08-02 23:08
477 查看
Android的网络应用 - 简单的C/S聊天室
服务器端:提供两个类
创建ServerSocket监听的主类:MyServer.java
负责处理每个Socket通信的线程类:ServerThread.java
客户端:是一个Android应用程序
==>MultiThreadClient
界面提供两个文本框和一个发送按钮
Activity通过Handler来处理来自子线程的消息
客户端需要一个子线程负责读取来自网络的数据
项目效果:
服务器端代码:
MyServer.java
ServerThrad.java
客户端代码:
布局文件:main.xml
Activity文件:MultiThreadClient.java
子线程类:ClientThread.java
服务器端:提供两个类
创建ServerSocket监听的主类:MyServer.java
负责处理每个Socket通信的线程类:ServerThread.java
客户端:是一个Android应用程序
==>MultiThreadClient
界面提供两个文本框和一个发送按钮
Activity通过Handler来处理来自子线程的消息
客户端需要一个子线程负责读取来自网络的数据
项目效果:
服务器端代码:
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聊天室
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简单介绍
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- RxAndroid的简单应用——实现网络图片的下载
- Android网络应用之使用Scoket的Android客户端与TCP服务器的简单交互
- 【android基础】之Android获取网络上的图片结合ImageView的简单应用
- Android-Socket多线程应用(聊天室客户端、Handler的简单使用)
- Android网络编程之Socket通信实现简单聊天室
- Android编写简单的聊天室应用
- Android 网络:基于TCP协议通信,多线程,实现简单的C/S聊天室
- Android AlarmClock 闹钟应用 简单分析
- Android获取应用信息判断网络连接返回桌面及卸载apk结束进程等的实现思路
- Android M(6.0)多网络应用
- Android中网络通信方式的简单汇总(HttpURLConnection、HttpClient、Socket等)
- Android 的简单应用(MusicPlayer) 以及 Soundpool池
- android TimerTask 的简单应用
- Java网络编程的简单应用 例程
- android中检测网络连接状态简单总结
- Android 一个判断网络连接状态的简单方法
- Java反射机制的原理及在Android下的简单应用