当前位置: 首页 > 编程日记 > 正文

android c聊天功能,Android实现简单C/S聊天室应用

Android的网络应用:简单的C/S聊天室,供大家参考,具体内容如下

服务器端:提供两个类

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

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

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

==>MultiThreadClient

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

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

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

项目效果:

7fedec5b3d767f2a53032bdf92b8ffb3.png

服务器端代码:

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模型) 大小解压后&#xff1a;1.73G 云桥网络 平台huo取素材 这个捆绑包23包括15种3D藤本植物和攀缘植物&#xff0c;用于一般的景观…

蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载

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

由Node.js事件驱动模型引发的思考

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

2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国未硫化橡胶制品行业市场行业相关概述、中国未硫化橡胶制品行业市场行业运行环境、分析了中…

使用 TListView 控件(3)

为什么80%的码农都做不了架构师&#xff1f;>>> 本例效果图: 代码文件: 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:\) &#xff08;复杂的状压DP&#xff09; \(solution:\) 很纠结的一道题目&#xff0c;写了大半天&#xff0c;就想练练手&#xff0c;结果这手生的。其实根据之前那道炮兵阵地就不应该写的&#xff0c;但是总觉得自己的思路会好一些&#x…

Blender基础入门学习教程 Learning Blender from Scratch

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

android 事件冒泡,Android事件分发

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

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”&#xff0c;选择菜单栏的“文件”-“将文件添加到资料库”选择要做铃声的歌曲&#xff0c;单击“打开”歌曲会出现在“资料库”的“音乐”里右击歌曲&#xff0c;选择“显示简介”选择“选项”填上“起始时间”和…

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&#xff0c; 给定平面上n个OIer和n台电脑&#xff0c;每个OIer只能水平向右和竖直向下&#xff0c;找到一台电脑写代码&#xff0c;其花费为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起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】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字符集问题&#xff0c;这次是由getBytes方法导致的。 以前的时候&#xff0c;曾经很多次的解决过java字符集以及乱码的问题&#xff0c;以为对这块很了解了&#xff0c;至到今天的又一次深入的学习&#xff0c;才发现以前的认识当中存在的问题&am…

Blender未来科幻武器全流程制作视频教程

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

android fragmentpageradapter切换不更新,关于android:在FragmentPagerAdapter中更新当前片段...

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

高级软件工程的第一次作业:回顾自己本科设计

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

如何定位并优化慢查询Sql

根据慢日志定位慢查询SQL。 查询慢日志相关变量&#xff0c;并进行设置&#xff1a; 主要关注下述三个变量&#xff1a; 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之函数三装饰器

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

Boom Library 93套影视游戏无损配乐音效素材合集包

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

将数据追加到html 表格中,将数据添加到数据表中

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

WIN7源码安装Apache和PHP注意事项

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

2022-2028年中国卫星导航行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星导航行业市场行业相关概述、中国卫星导航行业市场行业运行环境、分析了中国卫星导航行…