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

主要用到俩类,一个是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. ios 重签名

    http://stackoverflow.com/questions/6569120/resigning-an-application-outside-xcode #!/bin/sh TEMPDIR= ...

  2. .net版高斯模糊算法

    最近挺多人找高斯算法,本人贴上一个高斯模糊算法类,希望可以帮助到大家.算法的效率还是可以接受的. #region 高斯模糊算法 /// <summary> /// 高斯模糊算法 /// & ...

  3. 使用GridVIew显示Gantt(甘特图),动态增减列

    说明:本例是做了工厂的排机报表 一.根据查询日期初始化GridView列 private void IniGridView(DateTime p_DateS,DateTime p_DateE) { / ...

  4. RadioButtonList 属性设置

    RadioButtonList 属性里有RepeatDirection 设为Horizontal

  5. jdbc执行预处理,批处理,LOB字段处理,调用存储过程

    (1)jdbc执行预处理 PreparedStatment预备语句 eg:String sql="insert into user(id,name,birthday,money) value ...

  6. Tomcat配置错误导致Quartz执行两次问题

    以下基于tomcat服务器 我们通常将域名映射到指定服务器的端口上,以通过域名直接访问服务,如http://www.abc.com域名已绑定到本机的80端口,项目名wechat,则直接访问http:/ ...

  7. iOS开发技巧-2

    1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...

  8. SQL--create Table

    use MiddleHospitalgocreate table CMS_Infopublish_Auction( AuctionID int identity(1, 1) primary key,  ...

  9. Emacs 相关资料翻译

    Table of Contents 1. 37 Document Viewing 2. EmacsrelatedTranslation 2.1. Spacemacs 配置层(Configuration ...

  10. 【JavaScript】之【Object】

    见代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...