本程序是利用Socket编程将陀螺仪和加速度计信息(6位)发送到服务器。
我的问题是如何做套接字连接和从Android Wear发送数据到服务器(使用套接字连接)
以下是完整的程序::
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import com.example.helloandroid.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class HelloAndroid extends Activity implements SensorEventListener,Runnable {
private SensorManager sensorManager;
TextView x1; // declare X axis object
TextView y1; // declare Y axis object
TextView z1; // declare Z axis object
TextView x2; // declare X axis object
TextView y2; // declare Y axis object
TextView z2; // declare Z axis object
String x1Str,y1Str,z1Str,x2Str,y2Str,z2Str ;
String oldX1,oldY1,oldZ1,oldX2,oldY2,oldZ2;
Button sendAtATime,startContinous,dataChanged;
private boolean startStop = false ,valueChanged = true;
Context context ;
public HelloAndroid(){}
public HelloAndroid(String x1Str, String y1Str, String z1Str, String x2Str,
String y2Str, String z2Str) {
super();
this.x1Str = x1Str;
this.y1Str = y1Str;
this.z1Str = z1Str;
this.x2Str = x2Str;
this.y2Str = y2Str;
this.z2Str = z2Str;
}
@SuppressLint("NewApi") @Override
public void onCreate(Bundle savedInstanceState){
context = getApplicationContext();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
x1=(TextView)findViewById(R.id.x1); // create X axis object
y1=(TextView)findViewById(R.id.y1); // create Y axis object
z1=(TextView)findViewById(R.id.z1); // create Z axis object
x2=(TextView)findViewById(R.id.x2); // create X axis object
y2=(TextView)findViewById(R.id.y2); // create Y axis object
z2=(TextView)findViewById(R.id.z2); // create Z axis object
sendAtATime = (Button)findViewById(R.id.sendAtATime);
startContinous = (Button)findViewById(R.id.startContinuous);
sendAtATime.setOnClickListener(buttonSendOnClickListener);
startContinous.setOnClickListener(buttonContinuousClickListener);
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
// add listener. The listener will be HelloAndroid (this) class
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_NORMAL);
}
public void onAccuracyChanged(Sensor sensor,int accuracy){
}
public void onSensorChanged(SensorEvent event)
{
// check sensor type
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
{
oldX1 = x1.getText().toString();
oldY1 = y1.getText().toString();
oldZ1 = z1.getText().toString();
// assign directions/
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
x1.setText("X1: "+x);
y1.setText("Y1: "+y);
z1.setText("Z1: "+z);
}
if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
{
oldX2 = x2.getText().toString();
oldY2 = y2.getText().toString();
oldZ2 = z2.getText().toString();
// assign directions/
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
x2.setText("X2: "+x);
y2.setText("Y2: "+y);
z2.setText("Z2: "+z);
}
if(x1.getText().toString().equals(oldX1) && y1.getText().toString().equals(oldY1)
&& z1.getText().toString().equals(oldZ1) && x2.getText().toString().equals(oldX2)
&& y2.getText().toString().equals(oldY2) && z2.getText().toString().equals(oldZ2) )
{
valueChanged = false;
}
else
{
valueChanged = true;
}
if(startStop && valueChanged)
{
Thread aThread = new Thread(new HelloAndroid(x1.getText().toString()
,y1.getText().toString()
,z1.getText().toString()
,x2.getText().toString()
,y2.getText().toString()
,z2.getText().toString()));
aThread.run();
}
}
Button.OnClickListener buttonContinuousClickListener = new Button.OnClickListener()
{
public void onClick(View arg0)
{
if(startStop)
{
startStop = false;
startContinous.setText("Send Continous");
return;
}
startStop = true;
startContinous.setText("StopContinous");
}
};
Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener()
{
public void onClick(View arg0)
{
Thread aThread = new Thread(new HelloAndroid(x1.getText().toString()
,y1.getText().toString()
,z1.getText().toString()
,x2.getText().toString()
,y2.getText().toString()
,z2.getText().toString()));
aThread.run();
}
};
public void run()
{
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try
{
socket = new Socket("192.168.1.107", 5000);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF("\nAcceleration Values :\n"
+x1Str+"\n"
+y1Str+"\n"
+z1Str+"\n"
+"Orientation Values :\n"
+x2Str+"\n"
+y2Str+"\n"
+z2Str+"\n");
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (socket != null)
{
try
{
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (dataOutputStream != null)
{
try
{
dataOutputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (dataInputStream != null)
{
try
{
dataInputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
相关问题:Android wear不启动线程
我也阅读了http://developer.android.com/training/wearables/data-layer/index.html,但仍然在尝试最好的方式通过internet发送数据(而不是蓝牙插座--因为人可以走出范围)
有谁能帮我回答这个问题。
不幸的是,这是不可能的,因为Android Wear设备不能直接访问Internet(因此不能使用套接字、httpurlconnection
或任何类似的东西)。参见例如:
从可穿戴设备获取数据的唯一支持方式是使用数据或消息API,如您提到的文章(数据层)所述。
我有一个客户端和一个服务器。它们通过使用以下命令创建的套接字进行通信: 套接字(AF_INET,SOCK_STREAM,0) 他们之间的交流很好。 我想创建第三个程序,充当服务器并向客户端发送假消息。此程序必须使用以前创建的客户端和服务器套接字。 我使用发送命令与套接字ID由我的静态设置 写入(插座号,消息,1024) 但是它不起作用(我不确定这是正确的方法)。 因此,我尝试了telnet和nc(
我必须对FTP服务器进行编码,而且我在数据传输方面遇到了问题。 我在linux上使用ftp命令来测试它,我目前正在使用,它发送工作目录中的文件/目录列表。一切正常(ftp打印文件列表),除了ftp打印以下警告: 我想删除该警告,我认为ftp需要二进制数据,但我不知道如何通过套接字发送这样的数据,我目前正在使用最基本的方式发送结果:
问题内容: 错误2002(HY000):无法通过套接字’/var/run/mysqld/mysqld.sock’(2)连接到本地MySQL服务器 我尝试了在互联网上找到的所有内容,但是无法解决在Ubuntu 11.04上出现的问题。 我尝试了这些事情: 使用手动启动mysqld 使用启动mysqld 检查它是否正在使用并获得结果 在手动创建文件 授予用户权限 试图删除并重新安装,但仍然无法正常工作
我的服务器代码使用将消息发送到特定的套接字,请参阅https://socket.io/docs/emit-cheatsheet/ 但是,当连接坏了,客户机断开并再次连接时,socketId会发生变化,并且会失败。那么如何实现re-emit方法来处理重新连接呢? 我的问题与此相反,socket.io在x秒/第一次尝试获得响应失败后停止重新发出事件,从中我了解到socket.io客户端在重新连接时可以
线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi
我是一个初学者程序员,所以这很可能是显而易见的,我忽略了答案。但说到这个问题。 我有一个由两部分组成的程序(它比这个例子稍微复杂一点,但情况是一样的)。该程序在客户端和服务器之间触发了多条消息。我在服务器端有一个PrintWriter来向客户机发送消息,在客户机上有一个BufferedReader来读取发送的消息。当这个例子运行时,我得到了两行作为输出。第一个消息是两个消息,第二个消息是NULL。