【Android学习笔记】Android作为客户端与Linux服务器端通过Socket连接
2014-03-23 23:28
399 查看
之前查找过很多网上的例子,直接new一个socket对象,传ip值和端口号进去,发现在手机上运行之后,都是不行的,会出现android.os.NetworkOnMainThreadException 异常错误,弄了几天,终于发现只有通过异步线程的方法才测试出一个可以运行的代码。此程序是可以扫描服务器开放的端口,再连接,我这里是开放了60000端口,测试时连接60000的端口。需要服务器和客户端都连在同一个局域网上。我的ip地址是192.168.2.106,本例子是查找哪个端口开放,有句socket.close()被我注释掉了,可保证服务器与客户端一直通信。
Linux服务器端:编译通过之后执行,这里为方便测试,客户端发送什么数据,服务器便收到返回同样数据
手机客户端:
AndroidManifest:
注意,一定要在注册表上加上<uses-permission android:name="android.permission.INTERNET" />这句添加访问网络权限,否则连接不上。
异步线程方法如:(简单说下)
Linux服务器端:编译通过之后执行,这里为方便测试,客户端发送什么数据,服务器便收到返回同样数据
#include "./Server.cc" int main() { Server server; while (true) { server.setPort(60000); std::cout << "start connect...\n"; Server new_sock; std::string pattern = ","; //get client connect and accept it. server.accept(new_sock); while (true) { std::string ack = ""; std::string recv; new_sock >> recv; if (recv=="") { server.close(); break; } //std::cout << "\nWe recv the message from client : " << recv << std::endl; new_sock << recv; } } }
手机客户端:
package com.example.kam_socket3; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; 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.TextView; import android.widget.Toast; public class MainActivity extends Activity { private TextView tvPorts; private Button starScanBtn; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ //将已经打开的端口号显示在TextView控件上 tvPorts.append(String.valueOf(msg.what) + ":OK\n"); super.handleMessage(msg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvPorts = (TextView) findViewById(R.id.tvPorts); starScanBtn = (Button)findViewById(R.id.starScanBtn); starScanBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Thread thread = new Thread(new ConnetPort("192.168.2.106",60000)); thread.start(); Toast.makeText(MainActivity.this, "开始扫描", Toast.LENGTH_LONG).show(); } }); } class ConnetPort extends Thread{ private int conPort; private String ipAddress; public ConnetPort(String ipAddress,int conPort){ this.conPort = conPort; this.ipAddress = ipAddress; } @Override public void run(){ try{ Socket socket = new Socket(); SocketAddress socketAddress = new InetSocketAddress(ipAddress,conPort); socket.connect(socketAddress,50); handler.sendEmptyMessage(conPort); // socket.close(); } catch(Exception e){ } handler.post(new Runnable(){ @Override public void run(){ Toast.makeText(MainActivity.this, "扫描完成", Toast.LENGTH_LONG).show(); } }); } } @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; } }
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.kam_socket3" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.kam_socket3.MainActivity" 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" /> </manifest>
注意,一定要在注册表上加上<uses-permission android:name="android.permission.INTERNET" />这句添加访问网络权限,否则连接不上。
异步线程方法如:(简单说下)
new Thread(){ @Override public void run(){ //你要执行的方法 //执行完毕后给handler发送一个空消息 handler.sendEmptyMessage(0); } }.start(); //定义Handler对象 private Handler handler =new Handler(){ @Override //当有消息发送出来的时候就执行Handler的这个方法 public void handleMessage(Message msg){ super.handleMessage(msg); //处理UI } };
相关文章推荐
- Android客户端通过Socket连接服务器
- Android作为服务器通过USB使用Socket协议向PC客户端发送文件
- 如何通过SecureCRT作为客户端连接Linux服务器
- android 通过socket连接服务器与客户端
- Android客户端与服务器端通过SOCKET连接进行读写(将JSON数据转化为字符串后传输)
- FL2440 通过Socket使开发板作为服务器支持多个客户端连接并与之通信,可通过命令获取当前温度。
- 在Android中作为服务端开启socket连接
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)
- Android客户端通过socket与服务器通信(解决源码使用出现的错误)
- Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据
- Android:客户端通过HTTP连接服务器,完成注册并传送坐标信息
- Android通过webservice连接SQLServer 详细教程(数据库+服务器+客户端)
- Android通过webservice连接SQLServer 详细教程以及所遇到的问题解答(数据库+服务器+客户端)
- Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)--客户端代码
- Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天
- 如何使Android客户端通过socket与delphi的服务端通讯
- Socket通信:Linux服务器与多个Android客户端
- android的socket客户端在模拟上运行完美,是手机上不能连接上socket
- Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)--服务端代码