2015-02-11 2 views
0

сервера основного классаДвухсторонняя связь Java сокет с андроида

import java.awt.EventQueue; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JButton; 

import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.net.ServerSocket; 

import javax.swing.JScrollPane; 
import javax.swing.JList; 
import javax.swing.JPanel; 

public class Serwer { 

private JFrame frame; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       Serwer window = new Serwer(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 

MyServer server; 
Logowanie log; 

public Serwer() { 
    initialize(); 
} 

public static DefaultListModel login1 = new DefaultListModel(); 
public static DefaultListModel haslo1 = new DefaultListModel(); 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 405, 199); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    JButton start = new JButton("Start"); 
    start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      try { 
       server = new MyServer(login1, haslo1); 
       log = new Logowanie(login1, haslo1); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      }   
      server.start(); 
      log.start(); 

     } 
    }); 
    frame.getContentPane().add(start, BorderLayout.WEST); 

    JButton stop = new JButton("Stop"); 
    stop.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      if(server!=null){ 
       server.stopserver(); 
       server.stop(); 
       log.stopserver(); 
       log.stop(); 
       haslo1.addElement(login1.size()); 
       haslo1.addElement(login1.get(0)); 
      } 
     } 
    }); 
    frame.getContentPane().add(stop, BorderLayout.EAST); 

    JPanel panel = new JPanel(); 
    frame.getContentPane().add(panel, BorderLayout.CENTER); 
    panel.setLayout(null); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setBounds(10, 11, 124, 139); 
    panel.add(scrollPane); 

    JList login = new JList(login1); 
    scrollPane.setViewportView(login); 

    JScrollPane scrollPane_1 = new JScrollPane(); 
    scrollPane_1.setBounds(143, 11, 124, 139); 
    panel.add(scrollPane_1); 

    JList haslo = new JList(haslo1); 
    scrollPane_1.setViewportView(haslo); 
} 
} 

протоколирование сервера нить

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.DefaultListModel; 

public class Logowanie extends Thread { 

    DefaultListModel login, pass; 
    String log; 
    ServerSocket serversocket; 
    Socket socket; 

    public Logowanie(DefaultListModel log, DefaultListModel pas) throws UnknownHostException, IOException{ 
     login = log; 
     pass = pas; 
     serversocket = new ServerSocket(1235, 50, InetAddress.getByName("0.0.0.0")); 
    } 

    public void run(){ 
     for(;;){ 
      try{ 
      while(true){ 
      socket = serversocket.accept(); 
      login.addElement("Logowanie"); 

      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      log = in.readLine(); 
      in.close(); 

      for(int i = 0; i < login.size();i++){ 
       if(login.get(i).toString().equals(log)){ 
        PrintWriter out = new PrintWriter(socket.getOutputStream(),true); 
        out.print(login.get(i).toString()+"|"+pass.get(i).toString()); 
        out.close(); 
        socket.close(); 
        break; 
       } 
      } 
      } 
      } 
      catch(Exception e){ 
       login.addElement(e.getMessage()); 
      } 
     } 
    } 

    public void stopserver(){ 
     try{ 
      serversocket.close(); 
     } 
     catch(IOException e){ 
      login.addElement(e.getMessage()); 
     } 

    } 
} 

Client (Android) каротаж AsyncTask

package okar.graandro; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 

import android.app.Activity; 
import android.content.Intent; 
import android.location.GpsStatus.Listener; 
import android.os.AsyncTask; 
import android.widget.EditText; 

public class Logowanie extends AsyncTask<Object, Void, String> { 

    EditText text; 
    EditText pass; 
    String msg; 
    int rozz; 
    Activity act; 

    public Logowanie(Activity myContext){ 
     act = myContext; 
     text = (EditText) myContext.findViewById(R.id.login); 
     pass = (EditText) myContext.findViewById(R.id.haslo); 
    } 

    @Override 
    protected String doInBackground(Object... params) { 
     try{ 
      Socket socket = new Socket(InetAddress.getByName("192.168.1.1"), 1235); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(),true); 
      out.print(text); 
      out.close(); 

      this.wait(1000); 

      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      msg = in.readLine(); 
      in.close(); 
      socket.close(); 

      for(int i = 0; i < msg.length(); i++){ 
       if(msg.substring(i, i+1).equals("|")){ 
        rozz = i; 
       } 
      } 


     } 
     catch(Exception e){ 
      msg = e.getMessage(); 
     } 

     if(msg.substring(0,rozz).equals(text.getText().toString()) && msg.substring(rozz+1,msg.length()).equals(pass.getText().toString())){ 
      return "1"; 
     }else{ 
      return "0"; 
     } 

    } 

    @Override 
    protected void onPostExecute(String msg) { 
     if(Integer.valueOf(msg) == 1){ 
      Intent intent = new Intent(act, Mapa.class); 
      act.startActivity(intent); 
     }else{ 
      text.setText("niepoprawne dane"); 
     } 

    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
    } 
} 

У меня вопрос об этом код. Я делаю что-то неправильно? Должен ли я ждать или проверять статус в потоке или AsyncTask?

Когда я пытаюсь войти в систему, я получаю сообщение «Socket is closed».

Я понятия не имею, что я могу с ним сделать.

Greets.

EDIT

02-11 21:24:57.505: E/AndroidRuntime(1159): FATAL EXCEPTION: AsyncTask #1 
02-11 21:24:57.505: E/AndroidRuntime(1159): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.lang.Thread.run(Thread.java:856) 
02-11 21:24:57.505: E/AndroidRuntime(1159): Caused by: java.lang.NullPointerException 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at okar.graandro.Logowanie.doInBackground(Logowanie.java:56) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at okar.graandro.Logowanie.doInBackground(Logowanie.java:1) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
02-11 21:24:57.505: E/AndroidRuntime(1159):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
+2

Есть ли проблема с кодом при его запуске? – tnw

+0

При попытке войти в систему возникает проблема. У меня есть сообщение о том, что «Socket is closed» – Okar

+0

Пожалуйста, объясните, что вы ожидаете от кода, чтобы делать стихи, что вы наблюдаете (ошибки, неправильные результаты, зависание и т. Д.). – Mike

ответ

0

Вы закрываете OutputStream в клиенте в doItBackground() метод:

 PrintWriter out = new PrintWriter(socket.getOutputStream(),true); 
     out.print(text); 
     out.close(); 

и закрытие InputStream или OutputStream закрывает сокет, см:

Socket.getInputStream():

Закрытие возвращенного Инпа utStream закроет связанный сокет.

Я думаю, вы должны использовать методы shutdownInput()/shutdownOutput().

+0

Ну, это действительно сработало. Благодаря! Но теперь идет исключение: завершение работы завершено: конечная точка транспорта ENOTCONN не подключена – Okar

+0

, пожалуйста, опубликуйте весь стек. – rafalopez79

+0

Опубликовано в основной поток – Okar

Смежные вопросы