2

2 つのデバイスをソケットで接続しようとしましたが、うまくいきません。デバイスの 1 つはサーバーで構成 (リッスンする IP とポート) をデータベースに保存し、もう 1 つのデバイスであるクライアントはデータベースに接続し、構成を取得して接続します。

データベース クエリとエコーは正常に動作します (PHP) が、クライアント ソケットを開くメソッドが機能せず、接続に時間がかかり、例外がスローされます。ServerSocket が請願を受信しないのか、ClientSocket が送信しないのかわかりません...

以下のコード: (少し悪いですが、テスト用です)。

サーバーコード:

public class Server{

private int puerto = 4567;

private ServerSocket serverSocket;


public void conectar() {

    try {

        serverSocket = new ServerSocket(puerto);

        while (true) {

            Log.i("SocketServer", "escuchando");

            Socket cliente = serverSocket.accept(); 

            Log.i("Socket","Cliente ha conectado"); 

            BufferedReader ent = new BufferedReader(new InputStreamReader(
                    cliente.getInputStream())); 


            String linea = ent.readLine(); 

            Log.i("Cliente", "Cliente envia=" + linea);

            cliente.close(); 

            Log.i("Servidor","Cliente desconectado");
        }

    } catch (IOException e) {

        Log.e("Error", "Error en el servidor");

    }
}

クライアントコード:

public class Cliente {

private int puerto;

private InetAddress direccion;

public Cliente(int puerto, InetAddress direccion){

    this.puerto = puerto;

    this.direccion = direccion;

}

public void conectar(){

    try{

    Socket cliente = new Socket(direccion, puerto);

    Log.i("Cliente", "Conectado");

    conectado = true;

    PrintWriter salida=new PrintWriter(cliente.getOutputStream(),true);

    salida.println("Hola, soy el cliente");

    Log.i("Cliente", "Mensaje enviado");

    cliente.close();

    }catch(SocketException e){

        Log.e("ErrorSocket","Error al abrir socket " + e.getMessage());

    } catch (IOException e) {

        Log.e("ErrorSocket","Error al enviar " + e.getMessage());

    }


}

}

以下の方法で InetAddress を取得します。

//The String result param is like: "192.168.0.1&23456"

public InetAddress getInetAddress(String result) {

    InetAddress address = null;

    //5 it an example
    if (result.length() > 5 && result != null) {

        try {

            String[] data = result.split("&");

            Log.i("Data", data[0] + " " + data[1]);

            puerto = Integer.parseInt(data[1]);

            Log.i("PUERTO", "Puerto:" + puerto);

            String ip = data[0];

            Log.i("IP", ip);

            String[] str = ip.split("\\.");

            byte[] IP = new byte[str.length];

            for (int i = 0; i < str.length; i++) {

                IP[i] = (byte) Integer.parseInt(str[i]);
            }

            address = InetAddress.getByAddress(IP);

            Log.i("InetAddress",address.getCanonicalHostName());

        } catch (Exception e) {

            Log.e("Error", "Error al conseguir InnetAddress");

        }

    } else {

        Log.e("Error", "String capturado vacio");

        return address;
    }

    return address;

}

ありがとう:) これは、私の大学の最終プロジェクトである GPS チャットのテスト プロジェクトです。

編集: 3G nat はこの方法を中断して、ソケットによる 2 つのデバイス間の Android 接続を開発します。GCMや他のサーバーでのやり方を勉強します。

4

3 に答える 3

0

GPS 位置に関する情報を交換するためのより良いオプションは、websocket を使用することです。この種のアプリケーション用の非常に単純なサーバーhttps://github.com/yoman07/geo_server Android 用デモ クラスhttps://github.com/yoman07/PhotoShoter/blob/master/PhotoShoterModule/src/main/ java/com/photoshoter/SocketClient.java .

于 2014-04-25T19:58:36.203 に答える
0

クライアントコードの場合、これは私にとって非常にうまく機能することがわかりました:

OutputStreamWriter wr = new OutputStreamWriter(cliente.getOutputStream());

次に、データを送信するには:

wr.write("DATA TO SEND");
wr.flush();

良好なロギングが行われているようです。ログ出力行を追加して、ソケットを通過したかどうかを確認し、取得したすべてのデータを出力します。すべてのログが正しいデータを示しているのにクライアントが接続しない場合は、上記のコードを試してみてください。問題はありませんでした。

于 2012-11-10T22:36:29.273 に答える
0

ServerApplication.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;


public class ServerApp {
ArrayList clientOutputStreams;
public class ClientHandler implements Runnable{
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSocket){

try {
sock=clientSocket;
InputStreamReader isr=new InputStreamReader(sock.getInputStream());
reader=new BufferedReader(isr);
} catch (IOException e) {
 // TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
 public void run() {
 // TODO Auto-generated method stub
String message;
try {
while((message=reader.readLine())!=null)
{
System.out.println("read :"+message);
tellEveryone(message);
 }
  } catch (IOException e) {
  // TODO Auto-generated catch block
e.printStackTrace();
  }
  }
    private void tellEveryone(String message) {
   // TODO Auto-generated method stub
   Iterator itr=clientOutputStreams.iterator();
 while(itr.hasNext()){
 PrintWriter pWriter=(PrintWriter)itr.next();
 pWriter.println(message);
 pWriter.flush();
  }
  }

  }
   public static void main(String[] args) {
    // TODO Auto-generated method stub

    new ServerApp().createSocket();
  }
   private void createSocket() {
  // TODO Auto-generated method stub
   clientOutputStreams=new ArrayList();
   try {
ServerSocket socket=new ServerSocket(5000);
while(true){
Socket clientSocket=socket.accept();
PrintWriter writer=new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("Got a Connection to the Client");
 } 
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}



 Chat Client Source Code
 ===================================================
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;


public class ChatClient {
JTextField outgoing;
JTextArea incoming;
BufferedReader reader;
PrintWriter writer;
Socket sock;
public void layOutDesign(){
JFrame frame= new JFrame("Simple Chat Client");
JPanel mainPanel= new JPanel();
 incoming= new JTextArea(15,25);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane qScroller=new JScrollPane(incoming);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
outgoing=new JTextField(20);
JButton sendButton=new JButton("Send");
sendButton.addActionListener(new SendButtonListener());
mainPanel.add(qScroller);
mainPanel.add(outgoing);
mainPanel.add(sendButton);
setupNetworking();
Thread readerThread=new Thread(new IncomingReader());
readerThread.start();
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(400, 500);
frame.setVisible(true);
}
private void setupNetworking() {
// TODO Auto-generated method stub
try {
 sock=new Socket("10.30.10.156", 5000);
 InputStreamReader isR=new InputStreamReader(sock.getInputStream());
 reader=new BufferedReader(isR);
 writer=new PrintWriter(sock.getOutputStream());
  System.out.println("Network Established.");
 } catch (UnknownHostException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (IOException e) {
  // TODO Auto-generated catch block
 e.printStackTrace();
 }
}
 public class SendButtonListener implements ActionListener{

 @Override
 public void actionPerformed(ActionEvent ev) {
 // TODO Auto-generated method stub
 try{
 writer.println(outgoing.getText());
 writer.flush();
 }catch (Exception e1) {
  // TODO: handle exception
  e1.printStackTrace();
  }

  outgoing.setText("");
  outgoing.requestFocus();
 }

 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  new ChatClient().layOutDesign();
  }
 public class IncomingReader implements Runnable{

  String message;
  @Override
   public void run() {
  // TODO Auto-generated method stub
  try {
  while((message=reader.readLine())!=null){
  System.out.println("Read :"+message);
   incoming.append(message+"\n");
  }
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

  }
  }

サーバーコードに移動...そしてシステムのIPを変更してからクライアントに接続します

そして、ネットワーク内の同僚とのチャットをお楽しみください....

于 2013-06-19T11:51:10.227 に答える