Socket实现粗略的Android聊天功能
面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来。
主要用到俩类,一个是ServerSocket.class 一个是Socket.class。
记得要加权限: <uses-permission android:name="android.permission.INTERNET"/>
Server端SimpleServer: package com.socket.androidServer; import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner; public class SimpleServer {
public static ArrayList<Socket> socketList=new ArrayList<Socket>(); public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
ServerSocket ss=new ServerSocket(30000);
while (true) {
Socket s=ss.accept();
socketList.add(s);
new Thread(new ServerTherad(s)).start();
}
} } Server端SimpleServer: package com.socket.androidServer; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Iterator;
import java.util.Scanner; public class ServerTherad implements Runnable {
private Socket s = null;
private BufferedReader buRead = null;
StringBuffer stb=new StringBuffer();
public ServerTherad(Socket s) throws IOException {
this.s = s;
this.buRead = new BufferedReader(new InputStreamReader(
this.s.getInputStream(), "utf-8"));
} @Override
public void run() {
String connet=null;
try {
while ((connet=readFromClient())!=null) {
//System.out.println("信息\n"+stb.append(connet));
System.out.println("客户端说:"+connet);
for (Socket ss:SimpleServer.socketList) {
OutputStream out=ss.getOutputStream();
out.write((connet+"\n").getBytes("utf-8"));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String readFromClient(){
try {
return buRead.readLine();
} catch (Exception e) {
//删除此Socket
SimpleServer.socketList.remove(s);
}
return null;
} }
Client端MainActivity: package com.socket.androidClient; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException; import com.example.socketdemo.R; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity { private TextView testview=null;
private Button button=null;
private EditText text=null;
protected Handler handler=null;
private OutputStream out=null;
private Socket s = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.testview=(TextView)super.findViewById(R.id.test);
this.button=(Button)super.findViewById(R.id.button);
this.text=(EditText)super.findViewById(R.id.edit); this.handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==0x123) {
testview.append("客户端说:"+msg.obj.toString()+"\n");
}
}
};
//4.0之后访问网络不能在主程序中进行,要将代码放在线程中,不然会报错。
new Thread(new Runnable() { @Override
public void run() {
try {
s=new Socket("10.0.2.2", 30000);
new Thread(new ClientThread(s, handler)).start();
out=s.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start(); this.button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
try {
out.write((text.getText().toString()+"\n").getBytes("utf-8"));
text.setText("");
}catch (IOException e) {
e.printStackTrace();
}
}
}); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} } Client端ClientThread: package com.socket.androidClient; 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 Socket socket=null;
private Handler handler=null;
BufferedReader br=null;
public ClientThread(Socket s,Handler handler) throws IOException {
this.socket=s;
this.handler=handler;
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
}
@Override
public void run() {
try {
String connet=null;
while ((connet=br.readLine())!=null) {
Message message=new Message();
message.what=0x123;
message.obj=connet;
handler.sendMessage(message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
Socket实现粗略的Android聊天功能的更多相关文章
- Android 聊天功能
记录一个聊天功能代码,以后有时间再分析吧. GIt的地址:https://github.com/Maxi-Mao/ChatDemo 链接:https://pan.baidu.com/s/1NaXEkT ...
- socket 编程 TCP 实现简单聊天功能【转】
转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...
- 使用socket.io实现简单的聊天功能
Socket.io实际上是WebSocket的父集,Socket.io封装了WebSocket和轮询等方法 首先得在你的项目中安装socket.io $ npm install socket.io 服 ...
- 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...
- socket实现聊天功能(二)
socket实现聊天功能(二) WebSocket协议是建立在HTTP协议之上,因此创建websocket服务时需要调用http模块的createServer方法.将生成的server作为参数传入so ...
- android中实现简单的聊天功能
这个例子只是简单的实现了单机版的聊天功能,自己跟自己聊,啦啦~~ 主要还是展示RecyclerView控件的使用吧~ 参考我之前写的文章: android中RecyclerView控件的使用 andr ...
- Android表情功能
Android表情功能 标签(空格分隔): 未分类 转载自:android edittext插入表情(基于socket方式),并对文中不正确的内容进行整理和修正 [TOC] 涉及知识点: Androi ...
- Linux下p2p的聊天功能实现
Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...
- Swift - 使用socket进行通信(附聊天室样例)
在Swift开发中,如果我们需要保持客服端和服务器的长连接进行双向的数据通信,使用socket是一种很好的解决方案. 下面通过一个聊天室的样例来演示socket通信,这里我们使用了一个封装好的sock ...
随机推荐
- Redux教程1:环境搭建,初写Redux
如果将React比喻成士兵的话,你的程序还需要一位将军,去管理士兵(的状态),而Redux恰好是一位好将军,简单高效: 相比起React的学习曲线,Redux的稍微平坦一些:本系列教程,将以" ...
- Visor 应用之一 通过ER 设计生成数据库脚本和实体对象
前言 Visor(http://www.visor.com.cn) 是一个基于HTML5 Canvas 开发的IDE 框架和设计开发平台,有关Visor的设计架构和技术应用,在以后的文章里会逐渐跟 ...
- Cannot open the disk 'D:\Program Files\VMOS\Centos.vmdk' or one of the snapshot disks it depends on
启动vmware时出现以下错误: Cannot open the disk 'D:\Program Files\VMOS\Centos.vmdk' or one of the snapshot dis ...
- Linux学习 :Uboot, Kernel, 根文件系统初步分析
1.U-Boot启动内核的过程可以分为两个阶段: 1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段代码到RAM空间 设置好栈 跳转到第二阶段代码入口 2)第二阶段的功能 初始化本阶段使用的 ...
- 个人对sort()排序方法中比较函数一直很混乱,今日理清
需求:使用随机数来打印出0-10,并排序. 代码: var a = new Array();var testArray = function() { while (1) { var b = parse ...
- 例子:Execution Model Sample - 应用状态保存
WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...
- 使用CSS3动画模拟实现小球自由落体效果
使用纯CSS代码模拟实现小球自由落体效果: html代码如下: <div id="ballDiv"> <div id="ball">&l ...
- Unreal Engine Plugin management
Be aware to remove any dependencies to any modules related to Editor, or else it will end up with fa ...
- C#基础知识汇总
过了一遍基础视频,发现有一些最基本的知识点还掌握的不够,汇总如下: 1) 占位符 string name = "张三"; ; decimal salary = 7600.33M; ...
- freeCAD特性列表
通用特性 基本应用 FreeCAD 是跨平台的. 它在 Windows Linux 和 Mac OSX 等平台上运行表现一致. FreeCAD 是图形化应用程序. FreeCAD 基于著名的 GUI ...