Android的Socket编程模拟器通信 [英] Android Socket Programming Emulator Communication

查看:197
本文介绍了Android的Socket编程模拟器通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在同一台PC通过使用Socket编程,以仿真器之间发送消息第一个仿真器像一个服务器和第二个行为像客户端。但我无法envoke我的私人服务器和传递消息。我在Android的新任何机构可以plz帮助我。

我的code

服务器端code

 包com.test.android;进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口java.io.InputStreamReader中;
进口java.net.InetAddress中;
进口java.net.NetworkInterface;
进口java.net.ServerSocket的;
进口的java.net.Socket;
进口java.net.SocketException异常;
进口的java.util.Enumeration;进口android.app.Activity;
进口android.os.Bundle;
进口android.os.Handler;
进口android.util.Log;
进口android.widget.TextView;公共类ServerActivity延伸活动{
    私人TextView的serverStatus;    //默认IP
    公共静态字符串SERVERIP =192.168.0.20; // 10.0.2.15
    //指定一个PORT
    公共静态最终诠释SERVERPORT = 4000; // 8080
    私人处理程序处理程序=新的处理程序();
    私人的ServerSocket ServerSocket的;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.server);
        serverStatus =(的TextView)findViewById(R.id.server_status);
        SERVERIP = getLocalIpAddress();
        螺纹FST =新主题(新ServerThread());
        fst.start();    }    公共类ServerThread实现Runnable {
        公共无效的run(){
            尝试{
                如果(SERVERIP!= NULL){
                    handler.post(新的Runnable(){                        @覆盖
                        公共无效的run(){
                            serverStatus.setText(听上IP:+ SERVERIP);
                        }
                    });                    ServerSocket的=新的ServerSocket(SERVERPORT);                    而(真){
                        //监听传入CLIENTS
                        客户端的Socket的ServerSocket.accept =();
                        handler.post(新的Runnable(){
                            @覆盖
                            公共无效的run(){
                                serverStatus.setText(已连接);
                            }                        });                        尝试{
                            在的BufferedReader =新的BufferedReader(新的InputStreamReader(client.getInputStream()));
                            串线= NULL;
                            而((行= in.readLine())!= NULL){
                                Log.d(ServerActivity线);
                                handler.post(新的Runnable(){
                                    @覆盖
                                    公共无效的run(){
                                        //做任何你想做到前端
                                        //这是可以发挥创造性
                                    }
                                });                            }                            打破;
                        }赶上(例外五){
                            handler.post(新的Runnable(){
                                @覆盖
                                公共无效的run(){
                                    serverStatus.setText(哎呀连接中断,请重新连接您的电话。);
                                }
                            });                            e.printStackTrace();
                        }
                    }
                }其他{
                    handler.post(新的Runnable(){
                        @覆盖
                        公共无效的run(){
                            serverStatus.setText(无法​​检测到的网络连接。);
                        }
                    });
                }            }赶上(例外五){
                handler.post(新的Runnable(){
                    @覆盖
                    公共无效的run(){
                        serverStatus.setText(错误);
                    }
                });                e.printStackTrace();
            }
        }    }    // GETS手机的网络的IP地址
    私人字符串getLocalIpAddress(){
        尝试{
            对于(枚举<&NetworkInterface的GT; EN = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();){
                NetworkInterface的INTF = en.nextElement();
                为(枚举&所述;为InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements()){
                    InetAddress类InetAddress类= enumIpAddr.nextElement();
                    如果(inetAddress.isLoopbackAddress()!){返回inetAddress.getHostAddress()的toString()。 }
                }
            }
        }赶上(SocketException前){
            Log.e(ServerActivity,ex.toString());
        }        返回null;
    }    @覆盖
    保护无效的onStop(){
        super.onStop();
        尝试{
            //确保关闭SOCKET在退出时
            serverSocket.close();        }赶上(IOException异常五){
            e.printStackTrace();
        }
    }
}

客户端code:

 包com.test.android;进口java.io.BufferedWriter中;
进口java.io.OutputStreamWriter中;
进口的java.io.PrintWriter;
进口java.net.InetAddress中;
进口的java.net.Socket;进口android.app.Activity;
进口android.os.Bundle;
进口android.os.Handler;
进口android.util.Log;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.EditText;公共类ClientActivity延伸活动{
    私人的EditText SERVERIP;
    私人按钮connectPhones;
    私人字符串serverIpAddress =192.168.0.20; // // 10.0.2.15 IP MACHIN // 192.168.0.20的默认IP: - 10.0.2.2
    连接= FALSE私人布尔;
    私人处理程序处理程序=新的处理程序();    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.client);
        SERVERIP =(EditText上)findViewById(R.id.server_ip);
        connectPhones =(按钮)findViewById(R.id.connect_phones);
        connectPhones.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                如果(!连){
                     。serverIpAddress = serverIp.getText()的toString();
                     如果(!serverIpAddress.equals()){
                         螺纹cThread =新主题(新ClientThread());
                          cThread.start();
                     }                }            }
        });
    }
}

文件 ClientThread.java

 包com.test.android;进口java.io.BufferedWriter中;
进口java.io.OutputStreamWriter中;
进口的java.io.PrintWriter;
进口java.net.InetAddress中;
进口的java.net.Socket;进口android.util.Log;
进口android.widget.EditText;公共类ClientThread实现Runnable {
    私人字符串serverIpAddress =192.168.0.20; //10.0.2.15
    连接= FALSE私人布尔;
    @覆盖
    公共无效的run(){
        尝试{
            InetAddress类serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d(ClientActivity,C:连接...);
            Socket套接字=新的Socket(serverAddr,ServerActivity.SERVERPORT);
            连接= TRUE;            而(连接){
                尝试{
                    Log.d(ClientActivity,C:发送命令。);
                    为PrintWriter了=的新PrintWriter(新的BufferedWriter(新OutputStreamWriter(socket.getOutputStream())),TRUE);
                    通过out.println(嘿服务器!);
                    Log.d(ClientActivity,C:发送。);
                }赶上(例外五){
                    // TODO:处理异常
                }
                socket.close();
                Log.d(ClientActivity,C:关闭。);
            }
        }赶上(例外五){
            Log.e(ClientActivity,C:错误,E);
            连接= FALSE;
        }
    }
}


解决方案

我没试过你的code,但我认为你应该使用70作为SERVERPORT。

I need to send messages between to emulator on same pc by the use of Socket Programming first Emulator behave Like a Server and Second one behave Like Client. But I am unable to envoke my Server Emulator and passing messages. I am new in android can any body plz help me out.

My Code

Server side Code

package com.test.android;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class ServerActivity extends Activity {
    private TextView serverStatus;

    // DEFAULT IP
    public static String SERVERIP = "192.168.0.20"; // 10.0.2.15
    // DESIGNATE A PORT
    public static final int SERVERPORT = 4000;  // 8080
    private Handler handler = new Handler();
    private ServerSocket serverSocket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.server);
        serverStatus = (TextView) findViewById(R.id.server_status);
        SERVERIP = getLocalIpAddress();
        Thread fst = new Thread(new ServerThread());
        fst.start();

    }

    public class ServerThread implements Runnable {
        public void run() {
            try {
                if (SERVERIP != null) {
                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            serverStatus.setText("Listening on IP: " + SERVERIP);
                        }
                    });

                    serverSocket = new ServerSocket(SERVERPORT);

                    while (true) {
                        // LISTEN FOR INCOMING CLIENTS
                        Socket client = serverSocket.accept();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Connected.");
                            }

                        });

                        try {
                            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                            String line = null;
                            while ((line = in.readLine()) != null) {
                                Log.d("ServerActivity", line);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        // DO WHATEVER YOU WANT TO THE FRONT END
                                        // THIS IS WHERE YOU CAN BE CREATIVE
                                    }
                                });

                            }

                            break;
                        } catch (Exception e) {
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                                }
                            });

                            e.printStackTrace();
                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Couldn't detect internet connection.");
                        }
                    });
                }

            } catch (Exception e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Error");
                    }
                });

                e.printStackTrace();
            }
        }

    }

    // GETS THE IP ADDRESS OF YOUR PHONE'S NETWORK
    private String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
                }
            }
        } catch (SocketException ex) {
            Log.e("ServerActivity", ex.toString());
        }

        return null;
    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
            // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}    

Client Side Code :

package com.test.android;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ClientActivity extends Activity {
    private EditText serverIp;
    private Button connectPhones;
    private String serverIpAddress = "192.168.0.20"; // 10.0.2.15 // machin ip 192.168.0.20 // default ip:- 10.0.2.2 
    private boolean connected = false;
    private Handler handler = new Handler();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.client);
        serverIp = (EditText) findViewById(R.id.server_ip);
        connectPhones = (Button) findViewById(R.id.connect_phones);
        connectPhones.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!connected) {
                     serverIpAddress = serverIp.getText().toString();
                     if (!serverIpAddress.equals("")){
                         Thread cThread = new Thread(new ClientThread());
                          cThread.start();   
                     }   

                }

            }
        });
    }
}

File ClientThread.java:

package com.test.android;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import android.util.Log;
import android.widget.EditText;

public class ClientThread implements Runnable {
    private String serverIpAddress = "192.168.0.20"; //10.0.2.15
    private boolean connected = false;
    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
            connected = true;

            while (connected){
                try {
                    Log.d("ClientActivity", "C: Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                    out.println("Hey Server!");
                    Log.d("ClientActivity", "C: Sent.");
                } catch (Exception e) {
                    // TODO: handle exception
                }
                socket.close();
                Log.d("ClientActivity", "C: Closed.");  
            }
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}

解决方案

i have not tried your code, but i think you should use 70 as the SERVERPORT.

这篇关于Android的Socket编程模拟器通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆