面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来。

主要用到俩类,一个是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聊天功能的更多相关文章

  1. Android 聊天功能

    记录一个聊天功能代码,以后有时间再分析吧. GIt的地址:https://github.com/Maxi-Mao/ChatDemo 链接:https://pan.baidu.com/s/1NaXEkT ...

  2. socket 编程 TCP 实现简单聊天功能【转】

    转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...

  3. 使用socket.io实现简单的聊天功能

    Socket.io实际上是WebSocket的父集,Socket.io封装了WebSocket和轮询等方法 首先得在你的项目中安装socket.io $ npm install socket.io 服 ...

  4. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  5. socket实现聊天功能(二)

    socket实现聊天功能(二) WebSocket协议是建立在HTTP协议之上,因此创建websocket服务时需要调用http模块的createServer方法.将生成的server作为参数传入so ...

  6. android中实现简单的聊天功能

    这个例子只是简单的实现了单机版的聊天功能,自己跟自己聊,啦啦~~ 主要还是展示RecyclerView控件的使用吧~ 参考我之前写的文章: android中RecyclerView控件的使用 andr ...

  7. Android表情功能

    Android表情功能 标签(空格分隔): 未分类 转载自:android edittext插入表情(基于socket方式),并对文中不正确的内容进行整理和修正 [TOC] 涉及知识点: Androi ...

  8. Linux下p2p的聊天功能实现

    Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...

  9. Swift - 使用socket进行通信(附聊天室样例)

    在Swift开发中,如果我们需要保持客服端和服务器的长连接进行双向的数据通信,使用socket是一种很好的解决方案. 下面通过一个聊天室的样例来演示socket通信,这里我们使用了一个封装好的sock ...

随机推荐

  1. POJ 2229 Sumsets

    Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 11892   Accepted: 4782 Descrip ...

  2. TRANSPOSE的DATA步实现

    data a; input name $ a b ; cards; x x x y y y ; run; %macro transpose; proc sql noprint ; select cou ...

  3. Xcode中的Version和Build的区别

    Version( 应用程序发布版本号 ) Version对应的是CFBundleShortVersionString. Version 一般由产品部门确定,版本号是由分隔的整数组成的字符串,一般有2段 ...

  4. 【CSS3 入门教程系列】CSS3 Media Queries 实现响应式设计

    在 CSS2 中,你可以为不同的媒介设备(如屏幕.打印机)指定专用的样式表,而现在借助 CSS3 的 Media Queries 特性,可以更为有效的实现这个功能.你可以为媒介类型添加某些条件,检测设 ...

  5. c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast  [版权声明]转载请注明出处 http://www.cnblogs.c ...

  6. android 保存Bitmap 到本地 哦

    public String saveImage(Bitmap bmp) { File appDir = new File(Environment.getExternalStorageDirectory ...

  7. 事件问题 Event

    Event事件可以理解为在异步过程中实现同步的操作.但是要注意不要过分的使用Event,否则异步就失去了意义. 直接通过代码来说明: #include

  8. 两个七牛app上传小脚本

    把要更新的app放到/home/data下面 安卓: cat upload_apk.sh #!/bin/bashUser=xxxxx@qq.comPass=xxxxxxqrsctl-v3.1.2016 ...

  9. shell 指定范围随机数抽取

  10. css2--collapse

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...