您的位置:首页 > 移动开发 > Android开发

Android 用socket实现客户端发送消息,服务端显示消息

2016-08-31 20:55 513 查看
1.  服务端代码

package com.ziona.socket_service;

import java.io.DataInputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.PrintStream;

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.os.Bundle;

import android.app.Activity;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {

    TextView info, infoip, msg;

    String message = "";

    ServerSocket serverSocket;

    private DataInputStream dataInputStream;

    Button clear_message;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        info = (TextView) findViewById(R.id.info);

        infoip = (TextView) findViewById(R.id.infoip);

        msg = (TextView) findViewById(R.id.msg);

        clear_message = (Button) findViewById(R.id.clear_message);

        clear_message.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                message= "";

                msg.setText("");

            }

        });

        infoip.setText(getIpAddress());

        Thread socketServerThread = new Thread(new SocketServerThread());

        socketServerThread.start();

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        if (serverSocket != null) {

            try {

                serverSocket.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();

            }

        }

    }

    private class SocketServerThread extends Thread {

        DataInputStream dataInputStream = null;

        static final int SocketServerPORT = 8080;

        int count = 0;

        @Override

        public void run() {

            try {

                serverSocket = new ServerSocket(SocketServerPORT);

                MainActivity.this.runOnUiThread(new Runnable() {

                    @Override

                    public void run() {

                        info.setText("端口号 : "

                                + serverSocket.getLocalPort());

                    }

                });

                while (true) {

                    Socket socket = serverSocket.accept();

                    dataInputStream = new DataInputStream(socket.getInputStream());

                    String clientMessage = dataInputStream.readUTF();

                    count++;

                    message += "# "  + " from " + ":"  + clientMessage + "\n";

                    MainActivity.this.runOnUiThread(new Runnable() {

                        @Override

                        public void run() {

                            msg.setText(message);

                        }

                    });

                    SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(

                            socket, count);

                    socketServerReplyThread.run();

                }

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    private class SocketServerReplyThread extends Thread {

        private Socket hostThreadSocket;

        int cnt;

        SocketServerReplyThread(Socket socket, int c) {

            hostThreadSocket = socket;

            cnt = c;

        }

        @Override

        public void run() {

            OutputStream outputStream;

            String msgReply = " 您好! 服务台马上给您处理! " ;

            try {

                outputStream = hostThreadSocket.getOutputStream();

                PrintStream printStream = new PrintStream(outputStream);

                printStream.print(msgReply);

                printStream.close();

                message += " "  +"\n";

                MainActivity.this.runOnUiThread(new Runnable() {

                    @Override

                    public void run() {

                        msg.setText(message);

                    }

                });

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                message += "Something wrong! " + e.toString() + "\n";

            }

            MainActivity.this.runOnUiThread(new Runnable() {

                @Override

                public void run() {

                    msg.setText(message);

                }

            });

        }

    }

    private String getIpAddress() {

        String ip = "";

        try {

            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface

                    .getNetworkInterfaces();

            while (enumNetworkInterfaces.hasMoreElements()) {

                NetworkInterface networkInterface = enumNetworkInterfaces

                        .nextElement();

                Enumeration<InetAddress> enumInetAddress = networkInterface

                        .getInetAddresses();

                while (enumInetAddress.hasMoreElements()) {

                    InetAddress inetAddress = enumInetAddress.nextElement();

                    if (inetAddress.isSiteLocalAddress()) {

                        ip += "本机IP地址 : "

                                + inetAddress.getHostAddress() + "\n";

                    }

                }

            }

        } catch (SocketException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

            ip += "Something Wrong! " + e.toString() + "\n";

        }

        return ip;

    }

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center_horizontal"

        android:autoLink="web"

        android:text="消息中心"

        android:textSize="26dp"

        android:textStyle="bold" />

    <TextView

        android:id="@+id/info"

        android:layout_gravity="center_horizontal"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

    <TextView

        android:id="@+id/infoip"

        androi
d90a
d:layout_gravity="center_horizontal"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

    <Button

        android:id="@+id/clear_message"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textSize="20dp"

        android:text="清理消息"/>

    <ScrollView

        android:layout_gravity="center_horizontal"

        android:layout_width="match_parent"

        android:layout_height="match_parent" >

        <TextView

            android:id="@+id/msg"

            android:textSize="18dp"

            android:layout_gravity="center_horizontal"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content" />

    </ScrollView>

</LinearLayout>

//客户端

package com.example.admin.android_client;

package com.example.admin.android_client;

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import android.os.AsyncTask;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    TextView textResponse;

    EditText editTextAddress, editTextPort;

    Button buttonConnect, buttonClear,clear_house,call_service;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        editTextAddress = (EditText)findViewById(R.id.address);

        editTextPort = (EditText)findViewById(R.id.port);

        buttonClear = (Button)findViewById(R.id.clear);

        textResponse = (TextView)findViewById(R.id.response);

        clear_house= (Button) findViewById(R.id.clear_house);

        clear_house.setOnClickListener(buttonClear_houseConnectOnClickListener);

        buttonConnect = (Button)findViewById(R.id.connect);

        buttonConnect.setOnClickListener(buttonConnectOnClickListener);

        call_service= (Button) findViewById(R.id.call_service);

        call_service.setOnClickListener(buttonCall_serviceConnectOnClickListener);

        buttonClear.setOnClickListener(new OnClickListener(){

            @Override

            public void onClick(View v) {

                textResponse.setText("");

            }});

    }

    OnClickListener buttonConnectOnClickListener =

            new OnClickListener(){

                @Override

                public void onClick(View arg0) {

                    MyClientTask myClientTask = new MyClientTask(editTextAddress.getText().toString(), Integer.parseInt(editTextPort.getText().toString()));

                    myClientTask.execute();

                }};

    public class MyClientTask extends AsyncTask<Void, Void, Void> {

        String dstAddress;

        int dstPort;

        String response = "";

        MyClientTask(String addr, int port){

            dstAddress = addr;

            dstPort = port;

        }

        @Override

        protected Void doInBackground(Void... arg0) {

            DataOutputStream dataOutputStream = null;

            Socket socket = null;

            try {

                socket = new Socket(dstAddress, dstPort);

                dataOutputStream = new DataOutputStream(socket.getOutputStream());

                dataOutputStream.writeUTF("请勿打扰");

                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);

                byte[] buffer = new byte[1024];

                int bytesRead;

                InputStream inputStream = socket.getInputStream();//获得 服务端 发来的消息

    /*

     * notice:

     * inputStream.read() will block if no data return

     */

                while ((bytesRead = inputStream.read(buffer)) != -1){

                    byteArrayOutputStream.write(buffer, 0, bytesRead);

                    response += byteArrayOutputStream.toString("UTF-8");

                    Log.e(TAG,"-------------response = "+response);

                }

            } catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "UnknownHostException: " + e.toString();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "IOException: " + e.toString();

            }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();

                    }

                }

            }

            return null;

        }

        @Override

        protected void onPostExecute(Void result) {

            textResponse.setText(response);

            super.onPostExecute(result);

        }

    }

    //清理房间-----------------------------------------------------------------------

    OnClickListener buttonClear_houseConnectOnClickListener =

            new OnClickListener(){

                @Override

                public void onClick(View arg0) {

                    MyClientTask_Clear_house myClientTask_Clear_house = new MyClientTask_Clear_house(editTextAddress.getText().toString(), Integer.parseInt(editTextPort.getText().toString()));

                    myClientTask_Clear_house.execute();

                }};

    public class MyClientTask_Clear_house extends AsyncTask<Void, Void, Void> {

        String dstAddress;

        int dstPort;

        String response = "前台回应 :";

        MyClientTask_Clear_house(String addr, int port){

            dstAddress = addr;

            dstPort = port;

        }

        @Override

        protected Void doInBackground(Void... arg0) {

            DataOutputStream dataOutputStream = null;

            Socket socket = null;

            try {

                socket = new Socket(dstAddress, dstPort);

                dataOutputStream = new DataOutputStream(socket.getOutputStream());

                dataOutputStream.writeUTF("清理房间");

                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);

                byte[] buffer = new byte[1024];

                int bytesRead;

                InputStream inputStream = socket.getInputStream();//获得 服务端 发来的消息

    /*

     * notice:

     * inputStream.read() will block if no data return

     */

                while ((bytesRead = inputStream.read(buffer)) != -1){

                    Log.e(TAG,"-------------bytesRead = "+bytesRead);

                    byteArrayOutputStream.write(buffer, 0, bytesRead);

                    response += byteArrayOutputStream.toString("UTF-8");//这个response 是回应与服务端 连接成功,将消息打印在 自己这边,但这个消息没有发送给服务端

                    Log.e(TAG,"-------------response = "+response);

                }

            } catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "UnknownHostException: " + e.toString();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "IOException: " + e.toString();

            }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();

                    }

                }

            }

            return null;

        }

        @Override

        protected void onPostExecute(Void result) {

            textResponse.setText(response);

            super.onPostExecute(result);

        }

    }

//呼叫服务-------------------------------------------------------------------------------

OnClickListener buttonCall_serviceConnectOnClickListener =

        new OnClickListener(){

            @Override

            public void onClick(View arg0) {

                MyClientTask_Call_service myClientTask_Call_service = new MyClientTask_Call_service(editTextAddress.getText().toString(), Integer.parseInt(editTextPort.getText().toString()));

                myClientTask_Call_service.execute();

            }};

    public class MyClientTask_Call_service extends AsyncTask<Void, Void, Void> {

        String dstAddress;

        int dstPort;

        String response = "前台回应 :";

        MyClientTask_Call_service(String addr, int port){

            dstAddress = addr;

            dstPort = port;

        }

        @Override

        protected Void doInBackground(Void... arg0) {

            DataOutputStream dataOutputStream = null;

            Socket socket = null;

            try {

                socket = new Socket(dstAddress, dstPort);

                dataOutputStream = new DataOutputStream(socket.getOutputStream());

                dataOutputStream.writeUTF("呼叫服务");

                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);

                byte[] buffer = new byte[1024];

                int bytesRead;

                InputStream inputStream = socket.getInputStream();//获得 服务端 发来的消息

    /*

     * notice:

     * inputStream.read() will block if no data return

     */

                while ((bytesRead = inputStream.read(buffer)) != -1){

                    Log.e(TAG,"-------------bytesRead = "+bytesRead);

                    byteArrayOutputStream.write(buffer, 0, bytesRead);

                    response += byteArrayOutputStream.toString("UTF-8");

                    Log.e(TAG,"-------------response = "+response);

                }

            } catch (UnknownHostException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "UnknownHostException: " + e.toString();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

                response = "IOException: " + e.toString();

            }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();

                    }

                }

            }

            return null;

        }

        @Override

        protected void onPostExecute(Void result) {

            textResponse.setText(response);

            super.onPostExecute(result);

        }

    }

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    tools:context=".MainActivity" >

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center_horizontal"

        android:autoLink="web"

        android:text="客户端"

        android:textStyle="bold" />

    <EditText

        android:id="@+id/address"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="dstAddress" />

    <EditText

        android:id="@+id/port"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="dstPort" />

    <Button

        android:id="@+id/connect"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="请勿打扰..."/>

    <Button

        android:id="@+id/clear_house"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="清理房间..."/>

    <Button

        android:id="@+id/call_service"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="呼叫服务..."/>

    <Button

        android:id="@+id/clear"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Clear"/>

    <TextView

        android:id="@+id/response"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android socket
相关文章推荐