安卓Socket通信

进来做项目需要用到消息推送,顺手写一下Socket通信。

Socket是神马就不多说啦,说下它的特点以及和HTTP通信的区别。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。

下面先上一个Socket服务器端程序:

public class SocketServer {

    //消息编码方式
    public static final String bm = "utf-8";
    BufferedReader reader;
    BufferedReader inReader;
    BufferedWriter writer;

    /**
     * @param args
     */
    public static void main(String[] args) {
        SocketServer socketServer = new SocketServer();
        socketServer.StartServer();
    }

    private void StartServer() {
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            //设置服务器监听端口
            serverSocket = new ServerSocket(9898);
            System.out.println("启动成功");
            while (true) {
                socket = serverSocket.accept();
                System.out.println("客户端联入" + socket.hashCode());
                manageConnection(socket);
                sendMessage(socket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 向客户端发送消息
    private void sendMessage(final Socket socket) {

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 发送的消息从命令行得到
                    inReader = new BufferedReader(new InputStreamReader(
                            System.in));
                    writer = new BufferedWriter(new OutputStreamWriter(
                            socket.getOutputStream(), bm));
                    String recivedmsg;
                    while ((recivedmsg = inReader.readLine()) != null) {
                        System.out.println("发送:" + recivedmsg);
                        writer.write(recivedmsg + "\n");
                        writer.flush();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    try {
                        inReader.close();
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

    // 接受客户端发来的消息
    private void manageConnection(final Socket socket) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // 读取信息
                    reader = new BufferedReader(new InputStreamReader(
                            socket.getInputStream(), bm));
                    String recivedMsg;
                    while ((recivedMsg = reader.readLine()) != null) {
                        System.out.println(recivedMsg);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }
}

在服务器端我们主要是用到ServerSocket设置服务器监听端口,以及获得Socket对象。而我们主要的操作就是对这个Socket对象进行的操作。

下面是客户端代码:
布局部分:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <EditText
        android:id="@+id/ip_address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/neirong"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp" />

    <Button
        android:id="@+id/sendBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center_horizontal"
        android:text="发送"
        android:textColor="#1133aa"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/receiveText"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="20dp"
        android:gravity="center_horizontal"
        android:textColor="#000000"
        android:textSize="20sp" />

</LinearLayout>

SocketAvtivity类:

public class SocketAvtivity extends Activity implements View.OnClickListener {

    private TextView receiveText;
    private Button sendBtn;
    private EditText ip_address;
    private EditText neirong;

    private String ip;
    private Handler mHandler;
    private static final int ww = 123;

    private Socket socket;
    private BufferedReader reader;
    private BufferedWriter writer;

    //设置消息编码方式
    public static final String bm = "utf-8";
    public String serverip = "192.168.1.115";
    public int server_port = 9898;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_socket);

        sendBtn = (Button) findViewById(R.id.sendBtn);
        sendBtn.setOnClickListener(this);
        receiveText = (TextView) findViewById(R.id.receiveText);
        ip_address = (EditText) findViewById(R.id.ip_address);
        neirong = (EditText) findViewById(R.id.neirong);
        //服务器地址
        ip_address.setText(serverip);

        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case ww:
                        receiveText.setText((String) msg.obj);
                        break;
                }
            }
        };

        new Thread(new Runnable() {
            @Override
            public void run() {
                ip = ip_address.getText().toString();
                try {
                    socket = new Socket(ip, server_port);
                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), bm));
                    ReadServermsg(reader);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.sendBtn) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String msg = neirong.getText().toString();
                        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), bm));
                        writer.write(msg + "\n");
                        writer.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    }

    private void ReadServermsg(final BufferedReader reader) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String readerMsg;
                try {
                    while ((readerMsg = reader.readLine()) != null) {
                        Message message = new Message();
                        message.what = ww;
                        message.obj = readerMsg;
                        mHandler.sendMessage(message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

代码只有这么多,基本完成了Socket功能的介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值