Java Android tcp服务器通过按钮向客户端发送消息

Java Android tcp服务器通过按钮向客户端发送消息,java,android,sockets,tcp,Java,Android,Sockets,Tcp,如何使用按钮将数据(字符串)服务器发送到客户端? 我做了几次尝试,但我对android编程还不熟悉。因此 等待您的帮助..我的期望:只是一个小样本。。 我的目标是将数据从服务器发送到客户端 enter code here public class MainActivity extends ActionBarActivity { private TextView tvClientMsg,tvServerIP,tvServerPort; private final int SERVER_PORT

如何使用按钮将数据(字符串)服务器发送到客户端? 我做了几次尝试,但我对android编程还不熟悉。因此 等待您的帮助..我的期望:只是一个小样本。。 我的目标是将数据从服务器发送到客户端

enter code here  public class MainActivity extends ActionBarActivity {
private TextView tvClientMsg,tvServerIP,tvServerPort;
private final int SERVER_PORT = 13003; //Define the server port
@Override

protected void onCreate(Bundle saveenter code heredInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tvClientMsg = (TextView) findViewById(R.id.textViewClientMessage);
    tvServerIP = (TextView) findViewById(R.id.textViewServerIP);
    tvServerPort = (TextView) findViewById(R.id.textViewServerPort);
    tvServerPort.setText(Integer.toString(SERVER_PORT));


    getDeviceIpAddress();

    new Thread(new Runnable() {

        @Override
        public void run() {
            try {

                ServerSocket socServer = new ServerSocket(SERVER_PORT);

                Socket socClient = null;

                while (true) {

                    socClient = socServer.accept();

                    ServerAsyncTask serverAsyncTask = new ServerAsyncTask();


                    serverAsyncTask.execute(new Socket[] {socClient});
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

public void getDeviceIpAddress() {
    try {

        for (Enumeration<NetworkInterface> enumeration = NetworkInterface
                .getNetworkInterfaces(); enumeration.hasMoreElements();) {
            NetworkInterface networkInterface = enumeration.nextElement();

            for (Enumeration<InetAddress> enumerationIpAddr = networkInterface.getInetAddresses(); enumerationIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumerationIpAddr.nextElement();

                if (!inetAddress.isLoopbackAddress() && inetAddress.getAddress().length == 4) {

                    tvServerIP.setText(inetAddress.getHostAddress());
                }
            }
        }
    } catch (SocketException e) {
        Log.e("ERROR:", e.toString());
    }
}


public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

class ServerAsyncTask extends AsyncTask<Socket, Void, String> {


    protected String doInBackground(Socket... params) {
        String result = null;

        Socket mySocket = params[0];
        try {

            InputStream is = mySocket.getInputStream();

            PrintWriter out = new PrintWriter(
                    mySocket.getOutputStream(), true);

            out.println("Hello from server");

            BufferedReader br = new BufferedReader(
                    new InputStreamReader(is));

            result = br.readLine();


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




    }


    protected void onPostExecute(String s) {

        tvClientMsg.setText(s);
    }







}
}
在此处输入代码公共类MainActivity扩展ActionBarActivity{
私有文本视图tvClientMsg、tvServerIP、tvServerPort;
private final int SERVER_PORT=13003;//定义服务器端口
@凌驾
创建时受保护的void(Bundle saveenter code heredInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvClientMsg=(TextView)findViewById(R.id.textViewClientMessage);
tvServerIP=(TextView)findViewById(R.id.textViewServerIP);
tvServerPort=(TextView)findViewById(R.id.textViewServerPort);
tvServerPort.setText(Integer.toString(SERVER_PORT));
getDeviceIpAddress();
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
ServerSocket socServer=新的ServerSocket(服务器端口);
套接字socClient=null;
while(true){
socClient=socServer.accept();
ServerAsyncTask ServerAsyncTask=新的ServerAsyncTask();
执行(新套接字[]{socClient});
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}).start();
}
public void getDevicePaddress(){
试一试{
对于(枚举=网络接口)
.getNetworkInterfaces();枚举.hasMoreElements();){
NetworkInterface NetworkInterface=enumeration.nextElement();
对于(枚举enumerationIpAddr=networkInterface.getInetAddresses();枚举Ipaddr.hasMoreElements();){
InetAddress InetAddress=enumerationIpAddr.nextElement();
如果(!inetAddress.isLoopbackAddress()&&inetAddress.getAddress().length==4){
tvServerIP.setText(inetAddress.getHostAddress());
}
}
}
}捕获(SocketException e){
Log.e(“错误:,e.toString());
}
}
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
类ServerAsyncTask扩展了AsyncTask{
受保护字符串DOIN背景(插座…参数){
字符串结果=null;
套接字mySocket=params[0];
试一试{
InputStream=mySocket.getInputStream();
PrintWriter out=新的PrintWriter(
mySocket.getOutputStream(),true);
println(“来自服务器的你好”);
BufferedReader br=新的BufferedReader(
新的InputStreamReader(is));
结果=br.readLine();
}捕获(IOE异常){
e、 printStackTrace();
}
返回结果;
}
受保护的void onPostExecute(字符串s){
tvClientMsg.setText;
}
}
}

除了在线程中启动异步任务外,代码看起来还不错。所以请告诉我哪里出了问题。什么不起作用?代码流走了多远?客户端是否连接?您应该添加一些Log.d()语句来遵循流程。此外:你的客户告诉你什么?它连接吗?它期望什么是变灰消息?