首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

TensorFlow 开发者峰会将于今晚举行;维基百科使用AI机器学习算法来检测恶意评论 | AI开发者头条

TensorFlow 开发者峰会将于今晚举行(美国时间) 雷锋网获悉,第一届TensorFlow Dev峰会将于2017年2月15日在加利福尼亚州山景城举行,到时TensorFlow团队将会做相关的技术访谈和演示,整个活动将持续一整天,同时,整个会议还将在Google开发者论坛、YouTube上进行直播,给不能到现场的开发者提供第一手资料。 会议时间:2017年2月15日 会议地点:加利福尼亚州山景城 活动详情:https://events.withgoogle.com/tensorflow-dev-summit/#content 直播地址:https://www.youtube.com/watch?v=LqLyrl-agOw IBM与TensorFlow结合,PowerAI人工智能开发平台支持TensorFlow 0.12架构 2月14日,I

优秀的个人博客,低调大师

学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFil...

中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现。所谓的StartupFilter是对所有实现了IStartupFilter接口的类型及其对象的统称。IStartupFilter接口定义了如下一个唯一的方法Configure,该方法的参数next返回的Action<IApplicationBuilder>对象体现了后续StartupFilter和Startup对中间件的注册,而自身对中间件的注册则实现在返回的Action<IApplicationBuilder>对象中。[本文已经同步到《ASP.NET Core框架揭秘》之中] 1: publicinterface IStartupFilter 2: { 3: Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next); 4: } 我们可以采用服务注册的方式注册多个StartupFilter。具体来说,StartupFilter具有如下两种不同的注册方式,一种是通过调用WebHostBuilder的ConfigureServices方法以服务的形式注册所需的StartupFilter,另一种则是将针对StartupFilter的服务注册实现在启动类的ConfigureServices方法上。 1: //注册方式1 2: new WebHostBuilder() 3: .ConfigureServices(svcs => svcs 4: .AddSingleton<IStartupFilter, Filter1>() 5: .AddSingleton<IStartupFilter, Filter2>()) 6: … 7: 8: //注册方式2 9: publicclass Startup 10: { 11: publicvoid ConfigureServices(IServiceCollection svcs) 12: { 13: svcs.AddSingleton<IStartupFilter,Filter1>() 14: .AddSingleton<IStartupFilter, Filter2>(); 15: } 16: } 既然中间件可以同时通过Startup和StartupFilter进行注册,那么通过这两个种方式注册的中间件有何不同吗?其实它们唯一的区别在于StartupFilter注册的中间件会先执行。话句话说,对于由注册中间件构成的管道来说,通过Startup注册的中间件位于通过StartupFilter注册的中间件之后。我们不妨通过一个简单的实例来证实这一点。我们在一个ASP.NET Core控制台应用中定义如下四个中间件类型(Foo、Bar、Baz和Gux),它们针对请求的处理逻辑很简单,就是将自身的类型名称写入请求的响应中。 1: publicabstractclass MiddlewareBase 2: { 3: private RequestDelegate _next; 4: 5: public MiddlewareBase(RequestDelegate next) 6: { 7: _next = next; 8: } 9: public async Task Invoke(HttpContext context) 10: { 11: await context.Response.WriteAsync($"{this.GetType().Name}=>"); 12: await _next(context); 13: } 14: } 15: 16: publicclass Foo : MiddlewareBase 17: { 18: public Foo(RequestDelegate next) : base(next){} 19: } 20: publicclass Bar : MiddlewareBase 21: { 22: public Bar(RequestDelegate next) : base(next) {} 23: } 24: publicclass Baz : MiddlewareBase 25: { 26: public Baz(RequestDelegate next) : base(next) {} 27: } 28: publicclass Gux : MiddlewareBase 29: { 30: public Gux(RequestDelegate next) : base(next) {} 31: } 接下来我们定义了如下一个泛型的 StartupFilter<TMiddleware>类,这是一个专门用于注册指定类型中间件的StartupFilter,泛型参数代表注册的中间件类型。在实现的Configure方法中,我们将中间件的注册实现在返回的Action<IApplicationBuilder>对象中。 1: publicclass StartupFilter<TMiddleware> : IStartupFilter 2: { 3: public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) 4: { 5: return app=> { 6: app.UseMiddleware<TMiddleware>(); 7: next(app); 8: }; 9: } 10: } 我们最终编写如下一段简单的程序来启动承载的应用程序。如下面的额代码片段所示,在利用WebHostBuilder创建并启动WebHost之前,我们调用其ConfigureServices方法注册了两个StartupFilter<TMiddleware>对象,它们对应的中间件类型分别为Foo和Bar。在随后调用的Configure方法中,我们又完成了针对中间Baz和Gux的注册。这段程序实际上注册了五个中间件(调用ApplicationBuilder的Run方法可以视为中间件注册)。 1: publicclass Program 2: { 3: publicstaticvoid Main() 4: { 5: new WebHostBuilder() 6: .UseKestrel() 7: .ConfigureServices(svcs => svcs 8: .AddSingleton<IStartupFilter>(new StartupFilter<Foo>()) 9: .AddSingleton<IStartupFilter>(new StartupFilter<Bar>())) 10: .Configure(app => app 11: .UseMiddleware<Baz>() 12: .UseMiddleware<Gux>() 13: .Run(async context=> await context.Response.WriteAsync("End"))) 14: .Build() 15: .Run(); 16: } 17: } 我们现在需要确定注册的这五个在进行请求处理过程中的执行顺序。为此我们直接启动这个程序,然后开启浏览器访问默认的监听地址(http://localhost:5000),浏览器会按照如下图所示形式显示出请求在这个五个中间件中的“路由”。浏览器显示的结果清晰地表明通过StartupFilter注册的中间件比通过Startup注册的中间件先执行。对于两个采用相同方式注册的中间件,先被注册的中间会先执行。 作者:蒋金楠 微信公众账号:大内老A 微博: www.weibo.com/artech 如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 原文链接

优秀的个人博客,低调大师

周志明的《深入理解JAVA虚拟机》中基于栈的指令集和基于寄存器的指令集,要好好学习

这个知识点是我以前没有的,所以我以前发贴表示完全不理解JAR字节码的执行过程及以本地代码交互的过程。 现在有了这个知识点。 那对JVM的运行机制就了解了大概了。 周志明的《深入理解JAVA虚拟机》这书是本好书呀。 但由于我个人阅读习惯,三天之内要草草看一次的。所以没有按书上代码操作。 以后工作如何有应用时,再慢慢深入吧。 ~~~~~~~~~~~~~~~ NET CLR 和 Java VM 都是堆疊式虛擬機器(Stack-Based VM),也就是說,它們的指令集(Instruction Set)都是採用堆疊運算的方式:執行時的資料都是先放在堆疊中,再進行運算。Java VM 有約 200 個指令(Instruction),每個指令都是 1 byte 的 opcode(操作碼),後面接不等數目的參數;.NET CLR 有超過 220個指令,但是有些指令使用相同的 opcode,所以 opcode 的數目比指令數略少。特別注意,.NET 的 opcode 長度並不固定,大部分的 opcode長度是 1 byte,少部分是 2 byte。 -----------蔡学镛 ~~~~~~~~~~~~~~~ 这正如我上周上上周看那本陆嘉恒的《实战HADOOP》一样。通过HADOOP的源码概述,HDFS,MAPREDUCE实现过程和HIVE,HBASE,ZOOKEEPER,PIG...之类的应用,先在心里搭起HADOOP在IT世界的定位。在正确定位的基础上,来理解各个HADOOP的长处和短处,及其发展和存在的价值,也就顺理成章了。 剑走偏锋的理解是:WINDOWS,MACOS,LINUX可作为驱动,JVM作为操作系统,HDFS作为文件系统,MAPREDUCE作为系统API,HBASE类似于数据库系统(MYSQL,MS SQL不都是以NTFS,EXT3上的文件形式存在的么?)。ZOOKEEPER类似性能监控计数器,HIVE类似于标准SQL语言。。。。那这样理解下来,HADOOP类似于ORACLE???同类对比WINDOWS上的OFFCE套装?

优秀的个人博客,低调大师

10-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给C#TCP客户端显示)

https://yq.aliyun.com/articles/580125?spm=a2c4e.11155435.0.0.34723312e7QrBf 先写单片机端的程序先把源码和资料链接放到这里 链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A 密码:j1sz 等等哈,,,,我自己做一个android版本的TCP调试助手再接着写....发现别人的不好使.......老有问题,我担心让初学者感觉麻烦,所以自己做一个 稳定的调试助手再接着讲 现在接着说, APP可在百度手机助手,安卓市场,91助手,下载安装(搜索"小五物联")今天刚做好,增加了TCP客户端和服务器,其实前天做好了TCP客户端,但是测试出来问题了......在修改的过程中就把TCP客户端和服务器做到 可一个Pager做到了一起,这样以后再添加MQTT,WEB,蓝牙等功能的时候直接做到这里面刚发布出去,如果亲们不是我上面的界面说明还没审核通过,亲们可以用自己的调试助手,我就用自己做的,,因为做的功能 很全,很方便 等一下,,我先看看上一篇写到哪种程度了 咱先用TCP调试助手给单片机发指令,然后看一下回传的数据 先做单片机程序,就在上一篇的基础上增加功能 /** * @brief WIFI模块发送数据的命令 * @param id--发给哪一个连接的设备 * @param Length--数据的长度 * @param *SendData--数据 * @retval Overtime--接收命令的超时时间ms * @example **/ void ESPSendData(unsigned char id,unsigned char Length,unsigned char *SendData,int Overtime) { unsigned char Send [20]; int SendLength = 0; sprintf (Send, "AT+CIPSEND=%d,%d\r\n",(int)id, (int)Length); SendLength = 16; if(Length>=10){ SendLength = 17;} if(Length>=100){ SendLength = 18;} UartSendTI(Send,SendLength);//发送发送数据的命令 while(Overtime--) { if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, ">"))//收到回复 { DelayMs(50); break; } } DelayMs(1); } if(Overtime>0)//没有超时 { UartSendTI(SendData,Length); } } 这地方 if(Length>=10){ SendLength = 17;} if(Length>=100){ SendLength = 18;} 是因为 AT+CIPSEND=0,8rn 数据少于10个 16个字符AT+CIPSEND=0,12rn 数据少于10个 17个字符AT+CIPSEND=0,103rn 数据少于10个 18个字符主函数里面现在用手机连接模块的无线--先用调试助手测试,即使是做项目也是先用调试助手测试...还记得咱规定的命令不 启动服务器成功以后就进入while(1) 循环, 接收到数据 0xaa,0x55,0x01,0x01 则发送自己的温湿度数据 0xaa,0x55,温度(16进制表示),湿度(16进制表示) 假设 接收到 0xaa,0x55,0x01,0x01 温度10度,湿度50% 0xaa,0x55,,0x01,0x0a,0x32 这一节不加任何的校验位,后期再加 接收到数据 0xaa,0x55,0x02,0x00 控制小灯熄灭 接收到数据 0xaa,0x55,0x02,0xff 控制小灯点亮现在试一下数据是 返回的数据是 aa 55 01 15 1C 15化成十进制是21度 1C是28% 温度21度 相对湿度28% 说明可以采集了也能返回数据了,咱现在做C#采集端 说一下,自己想了想就不用委托和回调了,因为想起了自己以前学C#,感觉对于初学者而言怎样简单就怎样做,不要去太追究规则和约束,等真正入门了再去考虑那些东西. 其实这节是看着高大上但是却最是最简单的.... 咱前些日子写到现在增加几句话收到aa5501回复aa5501,对于为什么说不直接接收数据显示,因为你要先确定好确实可以接收,用串口调试助手先测试, 可能有人直接就接收显示了,也可以,不过以经验来说,最好还是先这样做,因为自己这样上过当,反正C#的串口接收就必须用空闲中断类似 的函数接收才行,因为每次接收到的不一定是一条数据.......... 我就先连接我的手机的TCP服务器调试一下,关于软件的使用可以看使用说明现在自己的APP还是有点问题会产生多余的发送任务,所以点击了一下发送,发送了好几次.................... 上一版本的没有这种情况,但是测试发现上一版本在5.1版本上任务却不让那样用,,,,郁闷,后期再找解决方法 先不管它,先做现在的上位机 现在添加一个定时器,每隔1S发送一次命令 private void timer1_Tick(object sender, EventArgs e) { SendBuffer[0] = 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x01; SendCnt = 3; } 现在测试一下是不是每隔1S发送一次数据 连接手机测试好现在显示温湿度看了看我的单片机程序 采集温湿度的命令是aa 55 01

优秀的个人博客,低调大师

8-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,做自己的手机TCP客户端发信息给单片机控制小灯的...

http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A密码:j1sz 先做手机的,然后做C#的 详细点的可以看我这篇文章,请参考着这篇看这篇文章,这篇文章会解决一些细节问题 http://www.cnblogs.com/yangfengwu/p/5212570.html 咱们不做很复杂的直接越简单越好,就做成这样 先编译一下 不用管,后期的话咱会用一下 最后做成这样子 发现还是有点大.. 把像素低的放到像素高的里面图片显示出来会缩小,把像素高的放到像素低的里面图片显示出来会放大 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener);//设置SWITCH的状态改变事件 } private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub // Toast.makeText(getApplicationContext(), isChecked+"", 500).show(); if (isChecked) {//切换图片 imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; 现在做点击连接按钮就连接服务器 刚看到............... 有点迫不及待的想试一试腾讯云了, 下面做的是:点击连接按钮,连接TCP服务器,连接上以后启动数据接收任务,因为数据接收任务可以判断是不是和服务器断开了连接 然后按钮显示"断开",如果意外断开了连接也显示断开.... public class MainActivity extends Activity { ImageView imageViewLamp;//灯的图片 Switch switchLamp;//灯的控制开关 EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框 Button buttonConnect;//连接按钮 Socket socket;//cocket boolean ConnectFlage = false;//连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一个连接任务的变量 InputStream inputStream;//获取输入流,可以用来判断有没有断开连接 ThreadReadData threadReadData = new ThreadReadData();//接收数据的任务的变量 boolean threadReadDataFlage = false;//接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024];//存储接收到的数据 int ReadBufferLengh = 0;//接收到的数据个数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//启动连接任务 } catch (Exception e) //预防任务还没关闭呢又点击开始 { threadConnectService.run(); } } else { ConnectFlage = true; buttonConnect.setText("连接"); try { socket.close();//关闭socket inputStream.close();//关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket = new Socket(ipAddress, port);//创建连接地址和端口 inputStream = socket.getInputStream();//获得通道的数据流变量 threadReadDataFlage = true;//一直接收数据 try { threadReadData.start(); } catch (Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1 if (ReadBufferLengh == -1) { threadReadDataFlage = false; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = true; buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); } } } } /** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false;//结束接收数据任务 super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 忘了说一件事情....加权限 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yfw456.tcpclientdemo" android:versionCode="1" android:versionName="1.0" > <!-- 获取手机信息权限 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>" <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"> </uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > 我把上面做的打包了 好现在接着写发数据(控制灯的亮灭) public class MainActivity extends Activity { ImageView imageViewLamp;//灯的图片 Switch switchLamp;//灯的控制开关 EditText editTextIPAdress,editTextPort;//ip地址和端口号的编辑框 Button buttonConnect;//连接按钮 Socket socket;//cocket boolean ConnectFlage = true;//连接标志,控制按钮显示连接和断开 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一个连接任务的变量 InputStream inputStream;//获取输入流,可以用来判断有没有断开连接 OutputStream outputStream;//获得输出流 ThreadReadData threadReadData = new ThreadReadData();//接收数据的任务 ThreadSendData threadSendData = new ThreadSendData();//发送数据的任务 boolean threadReadDataFlage = false;//接收数据任务一直运行控制 boolean threadSendDataFlage = false;//接收数据任务一直运行控制 byte[] ReadBuffer = new byte[1024];//存储接收到的数据 byte[] SendBuffer = new byte[1024];//存储发送的数据 int ReadBufferLengh = 0; int SendDataCnt = 0;//控制发送数据的个数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示灯控制开关*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = (byte) 0xff; } else { imageViewLamp.setImageResource(R.drawable.ledoff); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = 0x00; } SendDataCnt = 4;//控制发送数据的个数 } }; /*按钮点击连接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//启动连接任务 } catch (Exception e) //预防任务还没关闭呢又点击开始 { threadConnectService.run(); } } else { ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 buttonConnect.setText("连接"); try { socket.close();//关闭socket inputStream.close();//关闭数据流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 连接服务器的任务 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//获取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//获取端口号 socket = new Socket(ipAddress, port);//创建连接地址和端口 inputStream = socket.getInputStream();//获得通道的数据流 outputStream = socket.getOutputStream();//获得通道的输出流 threadReadDataFlage = true;//一直接收数据 threadSendDataFlage = true;//一直循环的判断是否发送数据 try { threadReadData.start(); } catch (Exception e) {//预防任务还没关闭呢又点击开始 threadReadData.run(); } try { threadSendData.start(); } catch (Exception e) { threadSendData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { ConnectFlage = false; buttonConnect.setText("断开"); Toast.makeText(getApplicationContext(), "连接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收数据的任务 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服务器断开会返回-1 if (ReadBufferLengh == -1) { threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0;//清零发送的个数 ConnectFlage = true; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0;//清零发送的个数 } } } } /** * 发送数据任务 * @author yang * */ class ThreadSendData extends Thread { public void run() { while (threadSendDataFlage) { if (SendDataCnt>0) //要发送的数据个数大于0 { try { outputStream.write(SendBuffer,0,SendDataCnt);//发送数据 SendDataCnt = 0;//清零发送的个数 } catch (Exception e) { runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,这里力求简单,下几节再用 public void run() { buttonConnect.setText("连接"); Toast.makeText(getApplicationContext(), "与服务器断开连接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//关掉发送任务,预防产生多的任务 threadReadDataFlage = false;//关掉接收任务,预防产生多的任务 SendDataCnt = 0; } } } } } /** 当活动(界面)不再可见时调用 */ @Override protected void onStop() { threadReadDataFlage = false;//结束接收数据任务 threadSendDataFlage = false;//结束发送数据任务 SendDataCnt = 0; super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 发送数据是写在了一个任务里面 整体的源码 本来想这一节也写好C#的,不过感觉写的够多的了,所以C#的放到下一节 下一篇 http://www.cnblogs.com/yangfengwu/p/8785516.html

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册