- 浏览: 537077 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
服务器代码如下:
此为java类,在Eclipse中建个工程,放进去下,右键直接run as,服务器便已经启动。
客户端代码:
直接用模拟器运行就可以。
main.xml布局文件:
AndroidManifest.xml:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { private static final int PORT = 9999; private List<Socket> mList = new ArrayList<Socket>(); private ServerSocket server = null; private ExecutorService mExecutorService = null; //thread pool public static void main(String[] args) { new Main(); } public Main() { try { server = new ServerSocket(PORT); mExecutorService = Executors.newCachedThreadPool(); //create a thread pool System.out.println("服务器已启动..."); Socket client = null; while(true) { client = server.accept(); //把客户端放入客户端集合中 mList.add(client); mExecutorService.execute(new Service(client)); //start a new thread to handle the connection } }catch (Exception e) { e.printStackTrace(); } } class Service implements Runnable { private Socket socket; private BufferedReader in = null; private String msg = ""; public Service(Socket socket) { this.socket = socket; try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //客户端只要一连到服务器,便向客户端发送下面的信息。 msg = "服务器地址:" +this.socket.getInetAddress() + "come toal:" +mList.size()+"(服务器发送)"; this.sendmsg(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { while(true) { if((msg = in.readLine())!= null) { //当客户端发送的信息为:exit时,关闭连接 if(msg.equals("exit")) { System.out.println("ssssssss"); mList.remove(socket); in.close(); msg = "user:" + socket.getInetAddress() + "exit total:" + mList.size(); socket.close(); this.sendmsg(); break; //接收客户端发过来的信息msg,然后发送给客户端。 } else { msg = socket.getInetAddress() + ":" + msg+"(服务器发送)"; this.sendmsg(); } } } } catch (Exception e) { e.printStackTrace(); } } /** * 循环遍历客户端集合,给每个客户端都发送信息。 */ public void sendmsg() { System.out.println(msg); int num =mList.size(); for (int index = 0; index < num; index ++) { Socket mSocket = mList.get(index); PrintWriter pout = null; try { pout = new PrintWriter(new BufferedWriter( new OutputStreamWriter(mSocket.getOutputStream())),true); pout.println(msg); }catch (IOException e) { e.printStackTrace(); } } } } }
此为java类,在Eclipse中建个工程,放进去下,右键直接run as,服务器便已经启动。
客户端代码:
package com.amaker.socket; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; /** * 除了isClose方法,Socket类还有一个isConnected方法来判断Socket对象是否连接成功。 * 看到这个名字,也许读者会产生误解。 * 其实isConnected方法所判断的并不是Socket对象的当前连接状态, * 而是Socket对象是否曾经连接成功过,如果成功连接过,即使现在isClose返回true, * isConnected仍然返回true。因此,要判断当前的Socket对象是否处于连接状态, * 必须同时使用isClose和isConnected方法, * 即只有当isClose返回false,isConnected返回true的时候Socket对象才处于连接状态。 * 虽然在大多数的时候可以直接使用Socket类或输入输出流的close方法关闭网络连接, * 但有时我们只希望关闭OutputStream或InputStream,而在关闭输入输出流的同时,并不关闭网络连接。 * 这就需要用到Socket类的另外两个方法:shutdownInput和shutdownOutput, * 这两个方法只关闭相应的输入、输出流,而它们并没有同时关闭网络连接的功能。 * 和isClosed、isConnected方法一样, * Socket类也提供了两个方法来判断Socket对象的输入、输出流是否被关闭, * 这两个方法是isInputShutdown()和isOutputShutdown()。 * shutdownInput和shutdownOutput并不影响Socket对象的状态。 */ //==================================================================================== /** * 运行过程剖析: * 1,服务器启动 * 2,客户端与服务器连接成功 * 3,服务器发送信息给客户端 的线程 * 4,线程通过Handler发送信息给UI线程 * 5,用TextView把信息显示 * * 当点击按钮时流程为: * 1,发送消息给服务器 * 2,服务器受到客户端发送来的信息,并给服务器返回信息 * 如上。 */ public class SocketDemo extends Activity implements Runnable { private TextView tv_msg = null; private EditText ed_msg = null; private Button btn_send = null; // private Button btn_login = null; private static final String HOST = "10.0.2.2"; private static final int PORT = 9999; private Socket socket = null; private BufferedReader in = null; private PrintWriter out = null; private String content = ""; //接收线程发送过来信息,并用TextView显示 public Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); tv_msg.setText(content); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv_msg = (TextView) findViewById(R.id.TextView); ed_msg = (EditText) findViewById(R.id.EditText01); btn_send = (Button) findViewById(R.id.Button02); try { socket = new Socket(HOST, PORT); in = new BufferedReader(new InputStreamReader(socket .getInputStream())); out = new PrintWriter(new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())), true); } catch (IOException ex) { ex.printStackTrace(); ShowDialog("login exception" + ex.getMessage()); } btn_send.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String msg = ed_msg.getText().toString(); if (socket.isConnected()) { if (!socket.isOutputShutdown()) { out.println(msg); } } } }); //启动线程,接收服务器发送过来的数据 new Thread(SocketDemo.this).start(); } /** * 如果连接出现异常,弹出AlertDialog! */ public void ShowDialog(String msg) { new AlertDialog.Builder(this).setTitle("notification").setMessage(msg) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); } /** * 读取服务器发来的信息,并通过Handler发给UI线程 */ public void run() { try { while (true) { if (!socket.isClosed()) { if (socket.isConnected()) { if (!socket.isInputShutdown()) { if ((content = in.readLine()) != null) { content += "\n"; mHandler.sendMessage(mHandler.obtainMessage()); } else { } } } } } } catch (Exception e) { e.printStackTrace(); } } }
直接用模拟器运行就可以。
main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/TextView" android:singleLine="false" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:hint="content" android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <Button android:text="send" android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.amaker.socket" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SocketDemo" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- 记得添加访问网络权限 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> </manifest>
发表评论
-
Android中如何模拟一次点击(touch)事件
2014-05-06 10:41 0在Android中有时需要模拟某一个View的touch事件, ... -
Android程序Crash时的异常上报
2014-04-28 18:15 0http://blog.csdn.net/singwhatiw ... -
android程序中证书签名校验的方法
2014-04-28 17:58 2015android程序中证书签名校验的方法一 2013-02 ... -
MD5理解错了,哎
2014-03-17 14:14 0MD5只对数据加密是无法解密的,也就是说,你把100加密后,就 ... -
Android 获取网络时间
2014-03-12 11:42 2048Android 获取网络时间 在网上看到的最常见的方式有: ... -
SQLite清空表并将自增列归零
2014-03-05 18:02 1558SQLite清空表并将自增列归零 作者:Zhu Yanfeng ... -
Handler小看一下
2013-11-11 16:42 0android handler调用post方法还是阻塞 su ... -
Frame Animation小看一下
2013-10-12 16:30 812Demo运行效果图: 源码: -
动画小学一下
2013-10-12 16:14 741转自: http://www.eoeandroid.com/f ... -
Android 动画之ScaleAnimation应用详解
2013-10-12 15:49 1024===============eoeAndroid社区推荐:= ... -
android开发中的一个工具类
2013-06-19 16:04 0package com.wanpu.login.dialog; ... -
android TextView怎么设置个别字体颜色并换行?
2013-06-20 09:25 1707(1)、TextView 设置个别字体颜色 TextView ... -
Android开发之文件下载,状态时显示下载进度,点击自动安装
2013-05-07 15:38 1439在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载 ... -
android中的状态保存
2013-04-07 14:21 985package com.zzl.call; import ... -
android动画基础:tween动画
2013-04-06 11:21 1264工程结构图: [img] [/img] 四个动画的xml ... -
面试中遇到的几个问题
2013-06-09 11:56 1023SAX与DOM之间的区别 SAX ( ... -
Android获取其他包的Context实例,然后调用它的方法,反射!!!
2013-03-25 10:32 1231Android中有Context的概念,想必大家都知道。Con ... -
Android的内存机制和常见泄漏情形
2013-03-06 16:55 799一、 Android的内存机制 Android的程序由Ja ... -
JUnit测试小小demo
2013-03-06 16:37 1183运行效果图: [img] [/img] 项目结构图 ... -
android开发中的异常小工具
2013-03-04 15:53 905package com.zzl.tools; impor ...
相关推荐
总的来说,这个demo项目综合运用了Android的蓝牙API、网络编程、数据处理和图形绘制技术,为学习和实践Android物联网应用开发提供了很好的示例。对于想要深入了解这些领域的开发者来说,这是一个非常有价值的参考...
本示例“Android-netty和socket通信的demo”将展示如何在Android平台上利用Netty进行网络通信,与传统的Socket编程相结合,实现更加灵活和高效的通信机制。 首先,理解Netty的基本概念是非常重要的。Netty是一个...
该项目可以帮助初学者理解如何在Android环境中实现Socket通信,通过实际操作学习网络编程的基本原理和实践。在实际应用中,可能还需要考虑多线程同步、安全性、网络状态检测、消息编码解码等问题,以提高应用的稳定...
在Android平台上,两个设备之间的...通过学习和理解这个示例,开发者能够掌握Android设备间的本地网络通信技术,为构建更多复杂的网络应用打下基础。在实际开发中,可以根据需求调整通信协议,提高通信效率和安全性。
在Android平台上,Socket编程是一种常见的通信方式,常用于设备间的局域网通信。这个"Android socket demo.zip"压缩包提供了一个简单的示例,包含了客户端(Client)和服务器端(Server)两个应用程序,帮助开发者...
以上就是关于“Android中Java和C的Socket通信Demo”的详细说明,包括Java Socket和C Socket的基本使用,JNI接口的建立,文件描述符的传递以及Ashmem的使用。理解并掌握这些知识点,能够帮助开发者在Android平台上...
在Android开发中,Socket通信是一种常见的网络编程方式,它允许设备与服务器之间进行双向数据传输。在这个特定的"Android socket demo"中,我们看到的主要功能是先发送JSON格式的数据到服务端,然后接收服务端处理后...
本Demo适用于博客:http://www.cnblogs.com/scetopcsa/p/4002835.html的《Android之Http网络编程(一)》、《Android之Http网络编程(二)》。就是简单的网络请求和访问,适合入门。
在Android平台上,Socket通信是一种常见的网络编程方式,用于设备间的双向数据传输。Socket基于TCP/IP协议,提供了可靠的、面向连接的通信服务。本篇将详细讲解Android Socket通信的基础知识、实现步骤以及注意事项...
在项目"SocketDemo"中,你可能会找到一个完整的Android客户端和Java服务端示例,包括了设置Socket连接、数据交换和断开连接的全部过程。通过研究这个示例,你可以更深入地理解Android和Java中的Socket通信,并将其...
`io.socket`库是Android开发者常用来实现WebSocket和TCP/IP Socket通信的一个优秀框架,它提供了一种优雅的方式来处理网络连接。本文将详细介绍如何使用`io.socket`进行Socket通信的简单封装,以便在迭代开发中提高...
在Android开发中,Socket编程是实现设备间通信的重要手段,特别是在构建网络应用和服务时。"Android socket编程1"是一个入门级示例,旨在教授如何在Android平台上使用Socket进行网络通信。这个示例程序中,开发者...
此demo包括两个moudle,一个Server,另一个Client,Server是个纯java文件,可以放到随便什么地方去执行,只要有JDK;Client是Android App。运行时注意修改IP为自己的IP
在Android开发中,Socket编程是实现设备间网络通信的关键技术之一。本文将深入探讨"Android socket编程2"这一主题,通过实例程序展示Android客户端如何与服务器端进行数据交互。 首先,Socket是网络通信中的一个...
总结,WebRTC-android-demo-and-Server项目是一个实用的实践案例,它涵盖了WebRTC技术在Android平台上的应用,以及如何利用Node.js构建一个简单的信令服务器。通过学习和研究这个项目,开发者可以深入理解WebRTC的...
SocketDemo项目通过具体的代码示例,帮助开发者理解并掌握这两种通信方式的使用,为开发实时通信功能的Android应用奠定了基础。在实际开发中,开发者可以根据需求选择适合的技术,并结合项目特点进行优化。
- Socket是网络编程的基本组件,它提供了进程间通信(IPC)的能力,特别是在分布式系统中,通过TCP/IP协议在不同主机之间建立连接。 - 在Android中,我们可以使用`java.net.Socket`类来创建和管理Socket连接。 2....
Socket编程是计算机网络通信中的重要概念,主要用于实现进程间的双向通信。...在这个"socket小demo"中,你可以学习到如何在Android客户端和Java服务器端之间搭建一个基本的通信桥梁,为后续的网络编程打下坚实的基础。
在提供的"Android Socket demo"压缩包中,可能包含了一个简单的Android Socket通信示例项目,包括客户端和服务器端的代码实现,你可以通过学习和运行这个示例来加深对Android Socket编程的理解。记得在实际部署时,...
总之,这个"Android基于Socket无线遥控demo"是一个很好的学习资源,它涵盖了Android网络编程的基础知识,以及如何利用Socket实现设备间的通信。通过深入理解并实践这个项目,开发者可以掌握网络编程在Android应用中...