- 浏览: 358549 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
格子衫星人:
不行 红米手机 版本21 测试失败
从assets目录复制文件夹和文件,(不只是文件,附demo) -
zclzcllll:
能不能再给个退个按钮和π的按钮的
基于VC的MFC计算器案例步骤及源代码 -
shezhangjiadao:
写的非常好!!不过我有几个小建议~希望楼主能更正一下~~[co ...
基于VC的MFC计算器案例步骤及源代码 -
flycatdeng:
夜色蓝 写道我想说dx在sdk的build-tools里面比如 ...
dx工具(android将jar包转成dex格式二进制jar包工具) -
夜色蓝:
我想说dx在sdk的build-tools里面比如build- ...
dx工具(android将jar包转成dex格式二进制jar包工具)
一、思路:
1、首先需要一个服务器,一个客户端:
PC作为服务器,手机Android作为客户端
2、服务器:接收流后将流输出并加上标识后再以流输出发送给客户端
3、客户端:将编辑框输入的字符串以字节流输出给服务器,再接收服务器的流并显示到另一个编辑框内!
4、大体思路如此!其他细节:
A:虽然setText()中括号里是int型数据,但任然可以在里面写字符串,因为EditText继承了TextView
B:流结束要有标识符
C:组件通过查找对应的ID并转型:
button_sendContent = (Button) this.findViewById(R.id.button_sendContent);//发送按钮 edit_content = (EditText) this.findViewById(R.id.edit_content);// 发送内容的编辑框
D:页面的跳转:
// 用户名个密码都正确后则跳转页面 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); FirstActivity.this.startActivity(intent);
E:之后添加的Activity需要注册:
<activity android:name=".SecondActivity"></activity>
F:使用互联网,需要添加互联网权限:
二、源代码及其注释:
1、服务器PC端:
package androidke.flycatdeng.lesson002; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * 服务器PC * @author flycatdeng * */ public class ChatServer { // 声明 Socket client;// 客户机对象 OutputStream ous;// 输出流对象 InputStream ins;// 输入流对象 /** * 启动服务器方法 */ public void processChat(int port) throws Exception { ServerSocket server = new ServerSocket(port);// 首先创建一个服务器并指定窗口 System.out.println("服务器创建成功,端口:" + port);//打印端口 // 服务器处于阻塞等待状态,但是如果这样就像手机接电话一样 只能一个客户,所以我们要等待循环 while (true) { client = server.accept(); System.out.println("有客户进来哒,IP是:" + client.getRemoteSocketAddress());// 打印客户的IP地址 dealClient(client);// 处理客户 } } // 处理用户的方法 public void dealClient(Socket client) throws Exception { // 从连结对象上得到输入输出流对象 ous = client.getOutputStream();// 这个输出的数据将会给连结对象(客户) ins = client.getInputStream();// 这个是客户机上输入的流 String s = "Hello,welcome to use CC\r\n";// 欢迎词 sendMSg(s);// 发送欢迎语 String inputs = readString(ins);//读取从客户机传来的流并转换为字符串 while (!inputs.equals("bye")) {//如果读取到的不是bye则继续读 System.out.println("读到的客户机说:" + inputs); String s2 = "client send:" + inputs + "\r\n"; System.out.println("正准备给客户机发送:" + s2); sendMSg(s2);//将流发送给客户机 inputs = readString(ins);//继续读客户机传来的流 } // 如果输入的字节是bye s = "welcome to here next time \r\n"; sendMSg(s); client.close();//关闭与客户的连结 } /** * 将要输出的字符串封装在一个方法里,以便调用 * @param s :得到的一个从客户机输入的字符串 */ public void sendMSg(String s) throws IOException { System.out.println("发送了" + s); ous.write(s.getBytes());//将字符串以字节数组读出 ous.flush();//强制完全输出 } /** * 读取输入流(一个一个字节的读),并返回输入的字符串 * @param ins:输入流 * @return:返回输入的字符串 * @throws Exception */ public String readString(InputStream ins) throws Exception { System.out.println("开始读流了!!"); // 创建一个字符串缓冲区 StringBuffer stb = new StringBuffer(); int in = ins.read(); System.out.println("这里执行了吗?"); char c; while (in != 13) {// 当不是回车键的时候 c = (char) in;// 强制将int型in转换为char类型 stb.append(c);// 将字符一个一个的附加 in = ins.read();// 再读 } String inputS = stb.toString().trim();// 将stb转换成字符串并去掉末尾的空格 System.out.println("读完流了!!"); return inputS; } // 主函数 public static void main(String[] args) { ChatServer cs = new ChatServer(); try { cs.processChat(8090); } catch (Exception e) { e.printStackTrace(); } } }
2、客户端Android:
第一个Activity:FirstActivity:
package androidke.flycatdeng.lesson002; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class FirstActivity extends Activity { // 声明 Button button_send; EditText edit_username, edit_password; Socket client; static InputStream ins;// 静态输入流对象 static OutputStream ous;// 静态输出流对象 // 这个Activity重写的onCreate方法相当于主函数 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { client = new Socket("220.168.117.31", 8090);//在显示页面之前创建客户对象 System.out.println("已经创建客户"); ous = client.getOutputStream(); ins = client.getInputStream(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } setContentView(R.layout.main);// 主页面为main.xml // 可视后取得各个组件的id并强制转换为相应的组件类型 button_send = (Button) this.findViewById(R.id.button_send);// 提交按钮 edit_username = (EditText) this.findViewById(R.id.edit_username);// 用户名编辑框 edit_password = (EditText) this.findViewById(R.id.edit_password);// 密码编辑框 // 给按钮添加(设置)监听器 button_send.setOnClickListener(ocl); } // 内部匿名类 OnClickListener ocl = new OnClickListener() {// 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener; // 重写方法 public void onClick(View v) { // 将编辑框的内容得到并转换为字符串 String username = edit_username.getText().toString(); String password = edit_password.getText().toString(); if ("d".equals(username) && "1".equals(password)) { // 用户名个密码都正确后则跳转页面 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); FirstActivity.this.startActivity(intent); } else { // 如果登录错误则提示 Toast.makeText(FirstActivity.this, "用户名不存在活密码错误!", 3).show();// 副本,内容,停留时间以秒为单位 } } }; }
第二个Activity:SecondActivity:
package androidke.flycatdeng.lesson002; import java.io.InputStream; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class SecondActivity extends Activity{ // 声明 Button button_sendContent; EditText edit_content; TextView TextView_show; String content; Socket client; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second);// 转到第二个页面second.xml // //跳转页面后取得其服务器ip和端口 // serverIP=this.getIntent().getStringExtra("localhost"); // port=this.getIntent().getIntExtra("8090", 8090); //创建客户端 对象 System.out.println("执行到这里!!!!!!!!!!"); try { processChat();//显示服务器发来的消息的方法 } catch (Exception e) { e.printStackTrace(); } button_sendContent = (Button) this.findViewById(R.id.button_sendContent);//发送按钮 edit_content = (EditText) this.findViewById(R.id.edit_content);// 发送内容的编辑框 button_sendContent.setOnClickListener(ocl); } // 内部匿名类 OnClickListener ocl = new OnClickListener() {// 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener; // 重写方法 public void onClick(View v) { content=edit_content.getText().toString(); System.out.println("客户端文本框输入的内容是:"+content); try { sendMSg(content+"\r\n");//将得到的编辑框内的内容以流输出 edit_content.setText("");//将其内容设置为空 content=edit_content.getText().toString();//再显示 processChat();//显示服务器发来的消息的方法,鼠标每次点击按钮都调用这个显示的方法 } catch (Exception e) { e.printStackTrace(); } } }; //创建客户的方法 public void processChat() throws Exception{ System.out.println("执行到这里了!!!!!!!!!!!!!"); String inputs=readString(FirstActivity.ins);//得到了服务器传来的字符串 System.out.println(inputs);//打印是否得到了服务器传来的字符串 TextView_show = (TextView) this.findViewById(R.id.TextView_show);// 显示内容的编辑框 TextView_show.setText(inputs);//设置上面的文本为得到的流的转换的字符串 TextView_show.getText().toString();//将其转换为字符串,如果没有这一句,文本将不会显示 } /** * 将要输出的字符串封装在一个方法里,以便调用 * @param s :得到的一个从客户机输入的字符串 */ public void sendMSg(String s) throws Exception{ System.out.println("在发送吗?"); FirstActivity.ous.write(s.getBytes()); FirstActivity.ous.flush(); System.out.println("向服务器发送流完成"); } /** * 读取输入流(一个一个字节的读),并返回输入的字符串 * @param ins:输入流 * @return:返回输入的字符串 * @throws Exception */ public String readString(InputStream ins) throws Exception { //创建一个字符串缓冲区 StringBuffer stb=new StringBuffer(); int in=ins.read(); char c; while (in != 13) {// 当不是回车键的时候 c = (char) in;// 强制将int型in转换为char类型 stb.append(c);// 将字符一个一个的附加 in = ins.read();// 再读 } String inputS=stb.toString().trim();//将stb转换成字符串并去掉末尾的空格 return inputS; } }
3、第一个页面: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:layout_width="fill_parent" android:layout_height="wrap_content" android:text="欢迎使用手机CC" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="用户名:" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/edit_username" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="密码:" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/edit_password" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="提交" android:id="@+id/button_send" /> </LinearLayout>
4、第二个页面:second.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:layout_width="fill_parent" android:layout_height="wrap_content" android:text="登录成功" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/TextView_show" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="false" android:id="@+id/edit_content" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="发送" android:id="@+id/button_sendContent" /> </LinearLayout>
5、效果:
发表评论
-
TextureView展示OpenGL内容(Demo)
2017-02-27 14:43 7347上图的实 ... -
自定义RatingBar的显示(评分组件)
2016-01-27 18:15 3526做项目中有要用到评分控件,本以为可以直接使用 ... -
ListView设置分割线的长度
2016-01-25 20:53 7484android中ListView默认的分割线是填充满整个l ... -
几种获取应用程序/apk安装包版本信息的方法
2015-12-19 15:17 12937获取到PackageInfo之后,那么包名,版本号什么的都可 ... -
获取IMEI号耗时10秒导致黑屏的解决
2015-12-16 23:24 1644描述:一个应用,首 ... -
android由应用包名得到该应用的默认启动类
2015-09-08 21:06 5612/** * get the launch ... -
android获取编译之后的点9图片
2015-09-07 17:22 4472今天要给桌 ... -
android小注意
2015-08-24 19:58 13223.一个Activity不能有多个GLSurfaceVie ... -
点击打开进入应用的动画(点击非Android View)
2015-05-16 17:06 4525android点击一个View进入一个应用,通常会有好几种动 ... -
SharedPreferences跨应用跨进程获取数据(附件)
2014-12-13 16:17 12419在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得 ... -
从assets目录复制文件夹和文件,(不只是文件,附demo)
2014-11-15 18:24 9603最近要将时钟的一些资源做成文件夹放到apk中,然后用户安装的 ... -
复制文件/文件夹,删除文件/文件夹
2014-10-20 12:33 947复制文件夹: public static boolean ... -
dx工具(android将jar包转成dex格式二进制jar包工具)
2014-10-08 10:21 53926好吧,不得不承认这个工具真心难找,也不知道自己sdk里以前 ... -
android获取系统铃声并播放
2014-09-24 15:33 30454private void startAlarm() thr ... -
亮屏解锁
2014-09-24 15:28 750/** * 解锁屏 * @para ... -
在自己应用中判断刚刚去往动态壁纸预览页面的壁纸是否设置成功
2014-08-15 19:03 3819本来从动态壁纸预览页 ... -
去往某个动态壁纸的预览页面,那里可以设置壁纸(4.12及其以上版本)
2014-08-12 17:15 3841/** * 去往某个动态壁纸的预览页面, ... -
android动态加载class文件(DexClassLoader可从SD卡加载)(android插件开发)
2014-08-05 21:22 3494一、思路 1、这段时间因为要做一个自定义 ... -
LibGDX制作android动态壁纸
2014-06-27 11:38 2750一、还是像普通的android动态壁纸一样,创建一个没有a ... -
android动态壁纸1——初步框架(有背景,能使用,仿可爱宝贝)
2013-10-30 18:52 4215可爱宝贝下载链接 一、简介: 正如别人 ...
相关推荐
android-support-v4-v7-v13-v14-v17(官方最新完整版),官方最新版的,压缩包内包含android-support-v4、android-support-v7-appcompat,android-support-v7-cardview,android-support-v7-gridlayout,android-support-...
在Android平台上,音频混合是一个非常有趣的领域,尤其对于开发K歌应用或者音乐制作类应用来说,音频混合功能是必不可少的。本项目名为“Android音频混合 -- K歌合成”,旨在实现类似唱吧K歌合成和Tom猫录音的效果,...
android-x86-4.0-RC2-eeepc.iso 用于安装测试机中使用.
标题中的"android-sdk-4.2.2 android-sdk-4.2.2-platforms"指的是Android SDK的一个特定版本,即Android 4.2.2(API级别17),该版本的SDK平台组件。这个版本是Android操作系统的 Jelly Bean 版本的一部分,发布于...
Android项目实战--手机卫士10--GPS定位与发送短信指令
总的来说,"xUltimate-d9pc-x86.rar"提供的工具可以帮助开发者和设计师更有效地处理点9图片,去除黑边,优化UI设计,从而提升Android应用的质量和用户体验。掌握这种工具的使用方法,对于从事Android开发的专业人士...
ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 要是需要最新的,下载地址: http://code.google.com/p/ksoap2-android/
当描述中提到"将android-18解压到Android\android-sdk\platforms下"时,这意味着你需要下载并安装Android 4.3(API级别18)的SDK平台,以便在开发环境中使用。 1. **API级别18**:每个Android版本都有一个对应的API...
Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
标题中的“android-sdk-windows-1.5_r3.zip-tools”表明这是一个针对Windows平台的Android SDK的早期版本,具体为1.5_r3。这个压缩包包含的是SDK中的“tools”目录,里面通常装有用于Android应用开发和设备管理的...
android-support-v4.jar android-support-v7-appcompat.jar v7-cardview.jar v7-gridlayout.jar v7-mediarouter.jar v7-palette.jar v7-recyclerview.jar android-support-v13.jar android-support-v17-...
我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端 (地址:http://blog.csdn.net/ouyang_peng/article/details/47004617) 我的Android进阶之旅------>Android实现用...
android sdk 3.1 android-sdk_r11-windows 只是个tool,sdk还要自己下载 手机开发平台 Google Android SDK 3.1 R11 Android eclipse插件安装: https://dl-ssl.google.com/Android/eclipse/ Android netBean插件安装:...
http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-windows.zip(推荐) http://s1.eoeandroid.com/sdk/4.1/installer_r20-windows.exe Mac版: http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-macosx.zip ...
[14本经典Android开发教程]-5-linux Android基础知识总结 ------------------------------------------------------- linux ,Android基础知识总结 1. Android编译系统分析 2. 文件系统分析 3. 制作交叉工具链 4. ...
强大的网络请求库,主要特征如下: 处理异步Http请求,并通过匿名内部类处理回调结果 Http请求均位于非UI线程,...通过线程池处理并发请求 处理文件上传、下载 响应结果自动打包JSON格式 自动处理连接断开时请求重连
在本文中,我们将深入探讨如何构建一个简单的Android聊天室应用,以及它与PC服务器端和客户端的交互。这个"Android简易版聊天室"项目旨在提供一个基础架构,用于理解多平台间实时通信的工作原理。 首先,我们要理解...
我的Android进阶之旅------>Android疯狂连连看游戏的实现 可以参考博客:http://blog.csdn.net/ouyang_peng/article/details/14115627
在Android开发中,自定义锁屏界面是一种常见的需求,它能提供独特的用户体验并增强应用程序的交互性。"Android自定义锁屏实现----仿正点闹钟滑屏解锁"这一主题,旨在教你如何创建一个类似“正点闹钟”应用中的滑动...