2011-05-28 107 views
0

我需要你的帮助!优化Java Socket发送Android到PC

因此,我在Android设备上获取了该应用程序,其中我从加速度计获取数据,并按下按钮将此数据获取到edittext,并在edittextes上设置侦听器。

当它改变时,会有一个函数创建一个套接字,发送数据并关闭套接字。

然后,我在我的计算机上创建了一个服务器应用程序,在其中创建服务器套接字,并创建两个线程,等待serversocket.accept()获取数据并将其放入texbox。就那么简单。

我很高兴我得到它的工作:-)但重点是,它不是很好。我相信整个交流是不好的,没有优化。它可以很好地发送数据,但通常会冻结,然后解冻并快速发送所有以前的数据等等。

对于我的错误代码,我很抱歉,但是有人可以对此好好看看,并提出我应该改变的内容,以及如何让它更加流畅和稳定地工作? :-(

这里的客户端代码:

package com.test.klienttcp; 

//import's... 

public class Klient extends Activity implements SensorListener { 


final String log = "Log"; 
EditText textOut; 
EditText adres; 
EditText test; 
EditText gazuje; 
TextView textIn; 
TextView tekst; 
TextView dziala; 
String numer = null; 
float wspk = 0; // wspolczynniki kalibracji 
float wychylenietmp = 0; 
float wychylenie = 0; 
int tmp = 0; 
int i = 0; 
boolean wysylaj = false; 

SensorManager sm = null; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    textOut = (EditText)findViewById(R.id.textout); 
    adres = (EditText)findViewById(R.id.adres); 
    gazuje = (EditText)findViewById(R.id.gazuje); 
    Button kalibracja = (Button)findViewById(R.id.kalibracja); 
    Button polacz = (Button)findViewById(R.id.polacz); 
    Button gaz = (Button)findViewById(R.id.gaz); 
    Button hamulec = (Button)findViewById(R.id.hamulec); 
    kalibracja.setOnClickListener(kalibracjaOnClickListener); 
    polacz.setOnClickListener(polaczOnClickListener); 
    gaz.setOnTouchListener(gazOnTouchListener); 
    hamulec.setOnTouchListener(hamulecOnTouchListener); 
    sm = (SensorManager) getSystemService(SENSOR_SERVICE); 

    //text listener steering 
    textOut.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(wysylaj) 
      { 
       Wyslij(); 
      } 
     } 
    }); 

    //text listener for throttle   
    gazuje.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
     } 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(wysylaj) 
      { 
       Gaz(); 
      } 
     } 
    }); 

} 

Button.OnClickListener polaczOnClickListener 
= new Button.OnClickListener(){ 
@Override 
public void onClick(View arg0) { 
// TODO Auto-generated method stub 
if(wysylaj==false) 
{ 
    wysylaj = true; 
} 
else 
{ 
    wysylaj = false; 
} 
}}; 

//throttle button handler 
Button.OnTouchListener gazOnTouchListener 
= new Button.OnTouchListener(){ 
@Override 
public boolean onTouch(View arg0, MotionEvent event) { 
    // TODO Auto-generated method stub 
    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
     gazuje.setText("1"); 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     gazuje.setText("0"); 
    } 
    return false; 
}}; 

//brake button handler 
Button.OnTouchListener hamulecOnTouchListener 
= new Button.OnTouchListener(){ 
@Override 
public boolean onTouch(View arg0, MotionEvent event) { 
    // TODO Auto-generated method stub 
    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
     gazuje.setText("2"); 
    } else if (event.getAction() == MotionEvent.ACTION_UP) { 
     gazuje.setText("0"); 
    } 
    return false; 
}}; 


//sensor handler 
public void onSensorChanged(int sensor, float[] values) { 
     synchronized (this) { 
      if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 
       wychylenie = values[0] * 10; 
       tmp = Math.round(wychylenie); 
       wychylenie = tmp/10; 
       if(wychylenie != wychylenietmp) 
       { 
       textOut.setText(Float.toString(wychylenie - wspk)); 
       wychylenietmp = wychylenie; 
       } 
      } 
     } 
    } 

public void onAccuracyChanged(int sensor, int accuracy) { 
     Log.d(log, "onAccuracyChanged: " + sensor + ", accuracy: " + accuracy); 

    } 

@Override 
    protected void onResume() { 
     super.onResume(); 
     sm.registerListener(this, SensorManager.SENSOR_ORIENTATION 
       | SensorManager.SENSOR_ACCELEROMETER, 
       SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    @Override 
    protected void onStop() { 
     sm.unregisterListener(this); 
     super.onStop(); 
    } 

    //callibration handler 

    Button.OnClickListener kalibracjaOnClickListener 
    = new Button.OnClickListener(){ 
    @Override 
    public void onClick(View arg0) { 
    // TODO Auto-generated method stub 
    try { 
     wspk = wychylenie; 
     } catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }}; 

    // sending steering data 
    public void Wyslij() 
    { 
     Socket socket = null; 
     DataOutputStream dataOutputStream = null; 
     DataInputStream dataInputStream = null; 
     try { 
      numer = adres.getText().toString(); 
      socket = new Socket(numer, 8888); 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
      dataInputStream = new DataInputStream(socket.getInputStream()); 
      dataOutputStream.writeUTF(textOut.getText().toString()); 
       if(socket.isClosed()) 
       { 
        test.setText("Socket zamkniety"); 
       } 
      //textIn.setText(dataInputStream.readUTF()); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally{ 
       if (socket != null){ 
       try { 
       socket.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 

       if (dataOutputStream != null){ 
       try { 
       dataOutputStream.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 

       if (dataInputStream != null){ 
       try { 
       dataInputStream.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 
      } 

    } 

    //sending throttle data 
    public void Gaz() 
    { 
     Socket socket = null; 
     DataOutputStream dataOutputStream = null; 
     DataInputStream dataInputStream = null; 
     try { 
      numer = adres.getText().toString(); 
      socket = new Socket(numer, 8889); 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
      dataInputStream = new DataInputStream(socket.getInputStream()); 
      dataOutputStream.writeUTF(gazuje.getText().toString()); 
       if(socket.isClosed()) 
       { 
        test.setText("Socket zamkniety"); 
       } 
      //textIn.setText(dataInputStream.readUTF()); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     finally{ 
       if (socket != null){ 
       try { 
       socket.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 

       if (dataOutputStream != null){ 
       try { 
       dataOutputStream.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 

       if (dataInputStream != null){ 
       try { 
       dataInputStream.close(); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       } 
      } 

    } 

} 

而这里的服务器代码:

//import's... 


public class Okno 
{ 
    public static float wychylenie; 
    public static String gaz="0"; 
    public static float jedzie; 
    public static int skrecam, gazuje; 
    public static String wiadomosc="100"; 
    private static int maxConnections=0, port=8888, portg=8889; 
    public static void main(String[] args) 
    { 
     skrecam = 0; 
     gazuje = 0; 
     Window ok = new Window(); 
     ok.setDefaultCloseOperation(3); 
     ok.setVisible(true); 
     ok.setResizable(false); 
     ok.setTitle("Serwer TCP"); 

     int i=0; 

     try{ 
      Robot robot = new Robot(); 
      Robot robotgaz = new Robot(); 
      ServerSocket listener = new ServerSocket(port); 
      ServerSocket listenergaz = new ServerSocket(portg); 

      while((i++ < maxConnections) || (maxConnections == 0)){ 

      //create thread for steering 
      if(skrecam == 0) 
      { 
       skrecam=1; 
      doComms conn_c= new doComms(listener); 
      Thread t = new Thread(conn_c); 
      t.start(); 
      } 

      //create thread for throttle 
      if(gazuje == 0) 
      { 
       gazuje=1; 
      doCommsgaz conn_gaz= new doCommsgaz(listenergaz); 
      Thread tgaz = new Thread(conn_gaz); 
      tgaz.start(); 
      } 

      ok.pole3.setText(wiadomosc); 
      ok.pole2.setText(gaz); 

      } 
     } 
     catch (AWTException e) { 
      e.printStackTrace(); 
     } 
     catch (IOException ioe) { 
      //System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
      } 

    } 

} 

    class doComms implements Runnable { 
     private Socket server; 
     private ServerSocket listener; 
     private String line,input; 

     doComms(ServerSocket listener) { 
      this.listener=listener; 
      } 

     public void run() { 

      input=""; 

      try { 

       Socket server; 
       server = listener.accept(); 
      // Get input from the client 
      DataInputStream in = new DataInputStream (server.getInputStream()); 
      //PrintStream out = new PrintStream(server.getOutputStream()); 

      Okno.wiadomosc = in.readUTF(); 

      server.close(); 
      Okno.skrecam=0; 
      } catch (IOException ioe) { 
      //System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
      } 
     } 
    } 

    class doCommsgaz implements Runnable { 
     private Socket server; 
     private ServerSocket listener; 
     private String line,input; 

     doCommsgaz(ServerSocket listener) { 
      this.listener=listener; 
      } 

     public void run() { 

      input=""; 

      try { 

       Socket server; 
       server = listener.accept(); 
      // Get input from the client 
      DataInputStream in = new DataInputStream (server.getInputStream()); 
      //PrintStream out = new PrintStream(server.getOutputStream()); 

      Okno.gaz = in.readUTF(); 

      server.close(); 
      Okno.gazuje=0; 
      } catch (IOException ioe) { 
      //System.out.println("IOException on socket listen: " + ioe); 
      ioe.printStackTrace(); 
      } 
     } 
    } 

class Window extends JFrame { 
    private JButton ustaw; 
    public JTextField pole1; 
    public JTextField pole2; 
    public JTextField pole3; 
    Window() 
    { 
     setSize(300,200); 
     getContentPane().setLayout(new GridLayout(4,1)); 
     JPanel panel1 = new JPanel(); 
     panel1.setLayout(new FlowLayout(1)); 
     getContentPane().add(panel1); 
     pole1 = new JTextField(15); 
     panel1.add(pole1); 
     JPanel panel2 = new JPanel(); 
     panel2.setLayout(new FlowLayout(1)); 
     getContentPane().add(panel2); 
     pole2 = new JTextField(15); 
     panel2.add(pole2); 
     JPanel panel3 = new JPanel(); 
     panel3.setLayout(new FlowLayout(1)); 
     getContentPane().add(panel3); 
     pole3 = new JTextField(15); 
     panel3.add(pole3); 
     JPanel panel4 = new JPanel(); 
     panel4.setLayout(new FlowLayout(1)); 
     getContentPane().add(panel4); 
     ustaw = new JButton("Ustaw"); 
     panel4.add(ustaw); 
     //action button handler 
     ustaw.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent zdarz){ 
      try{ 
      } 
      catch(Exception wyjatek){} 
      pole1.setText("costam"); 
     } 
    }); 
    } 
} 

再次,比较遗憾的是不优化,难以阅读的代码,但请,如果有人知道什么会更好,请回复。

非常感谢!

回答

0

cl客户端代码应该进入AsyncTask。谷歌已经很好的了解了它here。这不会加速任何事情,但它会阻止你的应用程序冻结。您可以在显示进度对话框的同时输入“处理”消息,以让用户知道发生了什么情况。

+0

感谢您的关注!当然我会检查并使用AsyncTask,因为它看起来很有用。但是,它真的能解决我的问题吗?我的意思是,没有火箭科学 - 我有很少的数据,需要发送它,我希望它实时发送,没有堵塞,但我的技能,我不能。 – Boro 2011-05-28 18:04:03