android c聊天功能,Android实现简单C/S聊天室应用
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 socketList
= new ArrayList();
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
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
android:id="@+id/input"
android:layout_width="240px"
android:layout_height="wrap_content"
/>
android:id="@+id/send"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="8px"
android:text="@string/send"
/>
android:id="@+id/show"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="top"
android:editable="false"
android:cursorVisible="false"
/>
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();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章:

docker 容器访问宿主机的解决方式
需求 基于本地docker的自研及使用需要,希望docker容器的服务能连接到宿主机提供的服务。 背景 网络上查阅了大量的资料,基本的解决办法是通过手动查阅IP的方式进行, 但docker宿主机的ip是会动态改变的,并不能保证永久不变。因此…

WinAPI: 输入光标相关的函数[3]
为什么80%的码农都做不了架构师?>>> 本例测试修改光标的形色, 效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls;typeTForm1 class(TForm)RadioGr…

用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用
public <T> T getFieldValue(Object target, String fieldName, Class<T> typeName){try {Object fieldValue FieldUtils.readField(target, fieldName, true);return (T)fieldValue;} catch (IllegalAccessException e) {log.error("出错:实体类{}没有{}类型…

藤本植物和攀爬植物模型包 Globe Plants – Bundle 23 – Vines and Creepers 03 (3D Models)
藤本植物和攀爬植物模型包 Globe Plants – Bundle 23 – Vines and Creepers 03 (3D Models) 全球植物–第23束–藤本植物和攀缘植物03 (3D模型) 大小解压后:1.73G 云桥网络 平台huo取素材 这个捆绑包23包括15种3D藤本植物和攀缘植物,用于一般的景观…

蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载
NES Emulator TV精选了上千款经典的红白机小游戏,我们小时候玩过的经典游戏都能够在这里找到,每一款游戏在这里都能够分别存档,没有太多时间的上班族可以尝试一下,给玩家带来最好的游戏体验。软件简介NES模拟器精选上千款红白机游…

由Node.js事件驱动模型引发的思考
引言 近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来。 什么是Node.…

2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国未硫化橡胶制品行业市场行业相关概述、中国未硫化橡胶制品行业市场行业运行环境、分析了中…

使用 TListView 控件(3)
为什么80%的码农都做不了架构师?>>> 本例效果图: 代码文件: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 class(TForm)ListView1: TListView;Button…

POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的。其实根据之前那道炮兵阵地就不应该写的,但是总觉得自己的思路会好一些&#x…

Blender基础入门学习教程 Learning Blender from Scratch
Blender基础入门学习教程 Learning Blender from Scratch 流派:电子学习| MP4 |视频:h264,1280720 |音频:aac,48000 Hz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小:5.5 GB |时长:7h 28m 你会学到什么 云…

android 事件冒泡,Android事件分发
当用户触摸屏幕时,系统会对触摸事件做出相应的相应,这个事件会产生一个MotionEvent,系统根据一定的规则将其传递给View进行处理,这个过程就是事件分发机制了。事件的传递分为两个阶段,即捕获阶段和冒泡阶段。捕获阶段&…

sqlserver trigger
1 --2 -- Create database trigger template 3 --4 USE [EasyJobExTest]5 GO6 7 --判断触发器是否存在,存在则删除8 IF EXISTS(9 select top 1 t.name as trigger_name,a.name as table_name from sys.triggers t,sys.objects a 10 where Lower(a.name)section and t.paren…

jenkins+sonarqube流水线脚本模板
pipeline { //这个任务在哪个主机上运行 //agent any//将这个项目运行在slave上 agent { label node1 }//参数化构建,主要设定git_version变量的值 parameters { string(name: git_version, defaultValue: v1.1, description: 选择你要部署的tag??) }stages { //整个部署的任…

苹果手机在火车站被偷的状况下如何定位找回
苹果手机在火车站被偷的状况下如何定位找回。首先打开“itunes”,选择菜单栏的“文件”-“将文件添加到资料库”选择要做铃声的歌曲,单击“打开”歌曲会出现在“资料库”的“音乐”里右击歌曲,选择“显示简介”选择“选项”填上“起始时间”和…

Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender
Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender CGCookie——Blender纹理基…

14/10/校内测试{天天考,丧心病狂}
1, 给定平面上n个OIer和n台电脑,每个OIer只能水平向右和竖直向下,找到一台电脑写代码,其花费为OIer与电脑之间的曼哈顿距离(|x_i-x_j||y_i-y_j|)。求出使n个OIer均找到自己电脑的最小花费。 输入输出格式 Input/output 输入格式&a…

android 图标拖动不了,拖动式选项卡(仿android) 添加了上下拉刷新后,下拉即刷新,而不是滚动到顶后再刷新,同时还想问一下正在刷新的图标怎么移到选项卡下...
这是我的HTML代码.mui-control-content {background-color: white;min-height: 600px;}.mui-control-content .mui-loading {margin-top: 50px;}新闻音乐sport第一个选项卡子项-1第一个选项卡子项-2第一个选项卡子项-3第一个选项卡子项-4第一个选项卡子项-5第一个选项卡子项-6第…

2022-2028年中国卫星互联网产业深度调研及投资前景预测报告(全卷)
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星互联网行业市场行业相关概述、中国卫星互联网行业市场行业运行环境、分析了中国卫星互…

Rhel6-heartbeat配置文档
系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 192.168.122.25 server25.example.com 所需的包:heartbeat-3.0.4-1.el6.x86_64.rpm heartbeat-libs-3.0.4-1.el6.x86_64.rpm heartbeat-devel-3.0.4-1.el6.x86_64.rpm 以下…

Java getBytes字符集问题
今天工作中又一次遇到了java字符集问题,这次是由getBytes方法导致的。 以前的时候,曾经很多次的解决过java字符集以及乱码的问题,以为对这块很了解了,至到今天的又一次深入的学习,才发现以前的认识当中存在的问题&am…

Blender未来科幻武器全流程制作视频教程
Blender 2.9 建模、UV、创建PBR纹理、照明和渲染全面学习视频教程 时长17h 30m 1280X720 MP4 语言:英语中英文字幕(根据原英文字幕机译更准确) 大小:15.3G 含项目素材 Blender完成PBR艺术创作:科幻板条箱和炮塔 云桥网络 平台hu…

android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...
我有一个带有标签指示器的viewPager。 ViewPager是带有FragmentPagerAdapter的setAdaper。我对FragmentPagerAdapter的内部工作原理了解甚少。我注意到即使邻居还不可见,邻居片段也会恢复(称为OnResume)。我将更新方法放在OnResume中,以为一旦片段是最新…

高级软件工程的第一次作业:回顾自己本科设计
本科毕业设计,是各位同学大学最后的一个成果,或是一个软件、或是一个游戏,但都体现了大家的辛勤和汗水。 在本课程学习之初,希望大家重拾个人之前的成果,并重新从软件工程的视角,探视设计中存在的不足&…

如何定位并优化慢查询Sql
根据慢日志定位慢查询SQL。 查询慢日志相关变量,并进行设置: 主要关注下述三个变量: long_query_time、show_query_log_file、show_query_log 慢查询sql会被记录到show_query_log_file 日志文件中。 show variables like %quer%; -- 查询…

介绍一个懒人创建springmvc项目的方法(二)
PS: 我是一个懒人,我懒得搭建项目连pom都不想去找,连web.xml都不想配置.所以就会想着找一些简便的办法,来适应我这种懒人. ---------------------------- 本人介绍的是用eclipse和sts插件创建springmvc项目,其他项目目前用不着,等用着的时候在研究吧. 前提: 1 eclipse已经配置好…

python之函数三装饰器
装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import time2 # time.time()获…

Boom Library 93套影视游戏无损配乐音效素材合集包
Boom Library 93套影视游戏无损配乐音效素材合集包 素材压缩包大小共:851G 每个合集为独立压缩包 可选择性下载 云桥网络 平台获取合集包 01.BOOM Library Assault Weapons Bundle【枪战机枪音效】 02.BOOM Library Birds of Prey【猛禽类音效】 03.BOOM Librar…

将数据追加到html 表格中,将数据添加到数据表中
将数据添加到数据表中03/30/2017本文内容在创建 DataTable 并使用列和约束定义其结构之后,您可以将新的数据行添加到表中。 要添加新行,可将一个新变量声明为 DataRow 类型。 当调用方法时,将返回新的 DataRow 对象 NewRow 。 然后࿰…

WIN7源码安装Apache和PHP注意事项
安装注意事项。 你注意下下载PHP,Apache的网站,上面有提示要安装Visual C库的。 Apache2.4.4需要VC10库支持,Microsoft Visual C 2010 SP1 Redistributable Package (x64) PHP5.6需要VC11库支持,Visual C Redistributable for Vis…

2022-2028年中国卫星导航行业深度调研及投资前景预测报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星导航行业市场行业相关概述、中国卫星导航行业市场行业运行环境、分析了中国卫星导航行…