Android实现简单C/S聊天室应用
程序员文章站
2022-04-12 11:25:29
android的网络应用:简单的c/s聊天室,供大家参考,具体内容如下
服务器端:提供两个类
创建serversocket监听的主类:myserver.java
负责...
android的网络应用:简单的c/s聊天室,供大家参考,具体内容如下
服务器端:提供两个类
创建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实现百度地图两点画弧线