使用Android网络编程实现简易聊天室
在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP、UDP网络通信API。我们可以使用ServerSocket、Socket来建立基于TCP/IP协议的网络通信;也可以使用DatagramSocket、Datagrampacket、MulticastSocket来建立基于UDP协议的网络通信。下面实现一个简单的聊天室,服务器端完全用Java代码实现,跟Android无关,客户端用Android应用来实现。
服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显示在界面上。这样就实现了客户端与客户端之间的即时聊天功能,为简便起见,本文中只写了一个客户端,代码如下:
服务器端:
创建服务器的主类:
package com.home.server; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList; public class MyServer { // 定义保存所有Socket的集合
public static ArrayList<Socket> socketList = new ArrayList<Socket>(); public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(20000);
System.out.println("服务器创建成功!");
System.out.println("等待客戶端的连接。。。");
while (true) {
// 此行代码会阻塞,等待用户的连接
Socket socket = ss.accept();
System.out.println("有客户端连接进来!");
socketList.add(socket);
// 每当客户端连接后启动一条ServerThread线程为该客户端服务
new Thread(new ServerThread(socket)).start();
}
} }
服务器的线程类:
package com.home.server; 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
private Socket socket = null;
// 该线程所处理的Socket所对应的输入流
BufferedReader br = null; public ServerThread(Socket socket) throws IOException {
this.socket = socket;
// 初始化该Socket对应的输入流
br = new BufferedReader(new InputStreamReader(socket.getInputStream(),
"utf-8"));
} @Override
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 (Exception e) {
e.printStackTrace();
}
} /**
* 定义读取客户端数据的方法
*
* @return
*/
private String readFromClient() {
try {
return br.readLine();
}
// 如果捕捉到异常,表明该Socket对应的客户端已经关闭
catch (Exception e) {
// 删除该Socket
MyServer.socketList.remove(socket);
e.printStackTrace();
}
return null;
}
}
客户端主类(Activity):
package com.home.activity; 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; import com.home.R;
import com.home.util.ClientThread; public class MultiThreadClient extends Activity {
private EditText input, show;
private Button sendBtn;
private OutputStream os;
private Handler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
input = (EditText) findViewById(R.id.main_et_input);
show = (EditText) findViewById(R.id.main_et_show);
sendBtn = (Button) findViewById(R.id.main_btn_send);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 如果消息来自子线程
if (msg.what == 0x234) {
// 将读取的内容追加显示在文本框中
show.append("\n" + msg.obj.toString());
}
}
};
Socket socket;
try {
socket = new Socket("192.168.0.101", 20000);
// 客户端启动ClientThread线程不断读取来自服务器的数据
new Thread(new ClientThread(socket, handler)).start();
os = socket.getOutputStream();
} catch (Exception e) {
e.printStackTrace();
}
sendBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
try {
// 将用户在文本框内输入的内容写入网络
os.write((input.getText().toString() + "\r\n").getBytes());
// 清空input文本框数据
input.setText("");
} catch (Exception e) {
e.printStackTrace();
}
}
});
} }
客户端线程类:
package com.home.util; 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 {
private Handler handler;
// 该线程所处理的Socket所对应的输入流
private BufferedReader br = null; public ClientThread(Socket socket, Handler handler) throws IOException {
this.handler = handler;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} @Override
public void run() {
try {
String content = null;
// 不断读取Socket输入流的内容
while ((content = br.readLine()) != null) {
// 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
Message msg = new Message();
msg.what = 0x234;
msg.obj = content;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
} }
Activity的布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/main_et_input"
android:layout_width="240dp"
android:layout_height="wrap_content" /> <Button
android:id="@+id/main_btn_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:text="发送" />
</LinearLayout> <EditText
android:id="@+id/main_et_show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cursorVisible="false"
android:editable="false"
android:gravity="top" /> </LinearLayout>
权限:
<uses-permission android:name="android.permission.INTERNET"/>
使用Android网络编程实现简易聊天室的更多相关文章
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- 网络编程-基于Websocket聊天室(IM)系统
目录 一.HTML5 - Websocket协议 二.聊天室(IM)系统的设计 2.1.使用者眼中的聊天系统 2.2.开发者眼中的聊天系统 2.3.IM系统的特性 2.4.心跳机制:解决网络的不确定性 ...
- C# 网络编程之简易聊天示例
还记得刚刚开始接触编程开发时,傻傻的将网站开发和网络编程混为一谈,常常因分不清楚而引为笑柄.后来勉强分清楚,又因为各种各样的协议端口之类的名词而倍感神秘,所以为了揭开网络编程的神秘面纱,本文尝试以一个 ...
- Linux C 网络编程——多线程的聊天室实现(server端)
server端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人.可进行更改),每一个人所发送的消息其它用户均能够收到.用户能够任意的增加或退出(推出以字符串"bye"实 ...
- Linux C 网络编程——多线程的聊天室实现(服务器端)
服务器端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人,可进行更改),每个人所发送的消息其他用户均可以收到.用户可以随意的加入或退出(推出以字符串"bye"实现),服 ...
- 示例:Socket应用之简易聊天室
在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...
- Android 网络编程 记录
简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面 ...
- php+websocket搭建简易聊天室实践
1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...
随机推荐
- Python超级明星WEB框架Flask
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- 基于OCR的SeeTest框架可行性分析总结
总的来说相比其他几个免费框架,SeeTest功能更全面和易用,但收费有点昂贵:License 3500/年:多平台和多语言(基于OCR)还需要额外购买,分别是500/Year和1750$/.详情请查看 ...
- JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承
说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象J ...
- IT行业新名词--透明手机/OCR(光学字符识别)/夹背电池
透明手机 机身设计的一大关键部分是可替换玻璃的使用,利用导电技术,在看不到线路的环境下,让LED发光. 这样的玻璃内含液晶分子,对于内容的显示则是通过电流对分子的刺激来实现.当手机断电后,分子位置会随 ...
- Spring之单元测试
引言 是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标.使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的BUG,便于调试可以提高我们写程序的效率.以前我们做单元测试的 ...
- 网易ios 面试
1 说说 你对 MRC和 ARC 的理解 2 对OC内存分析 有什么好的方法, 3 corePlot 4 pop 动画 5 cocoapods 6 GCD 7 瀑布流 及 uicollection ...
- 清空SQL Server数据库中所有表数据的方法
原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...
- MY WAY程序(十八) 团队开发
1.通信知识 要了解的强哥的移动通信先验知识布局.我和另外一个毕业生有自己的学习,但我真的没有认真看.了解了一下,其余大部分时间在搞nodejs.另外一个应届毕业生则是按着一本电子书 ...
- 远程连接mysql速度慢的解决方法
最近在公司内部连mysql速度非常慢,一直还以为公司的网络有问题,后经查发现出现这种问题的主要原因是mysql默认开启了DNS的反向解析功能,连接时反向解析计算机名称时耗时严重,导致连接超慢.解决方法 ...
- .NET MVC学习之模型绑定
ASP.NET MVC学习之模型绑定(2) 继ASP.NET MVC学习之模型绑定继续 3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了 ...