Android TCP通信(一)

原创 2016年05月30日 11:35:38

什么是Socket?
Socket是应用层与TCP/IP协议簇通讯的中间抽象层,Socket是一组接口,在设计模式中,Socket的设计就是门面模式,它把复杂的TCP/IP协议簇的内容隐藏在套接字接口后面,用户无需关心协议的实现,只需使用Socket提供的接口即可。
Socket的类型有两种,一种是面向连接的TCP应用服务,一种是面向无连接的UDP(User Data Package)应用服务。通俗的理解就是,TCP方式是打电话(连接性),UDP方式是发短信(无连接)。

Ok,以上是简单的科普,那么接下来就看下如何在Android上利用TCP/IP协议使用Socket与Server进行通讯吧!今天我们要使用的是面向连接的TCP方式。首先,在本机建立一个Java项目作为Server Client,代码如下

1.服务端

开启一个socket服务端监听一个端口。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerTest {

    private static final int SERVER_PORT = 1234;

    public static void main(String[] args) {

        System.out.println("server begin lisening port " + SERVER_PORT
                + ".............");
        try {
            ServerSocket server = new ServerSocket(SERVER_PORT);
            while (true) {
                // 循环监听客户端请求
                Socket clientSocket = server.accept();
                System.out.println("server receiving.............");

                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(clientSocket.getInputStream()));
                    // 从客户端监听到的信息
                    String str = reader.readLine();
                    System.out.println("server received= " + str);
                } catch (Exception e) {
                    System.out.println("server error." + e.getMessage());
                } finally {
                    clientSocket.close();
                    System.out.println("server close.");
                }
            }
        } catch (IOException e) {
            System.out.println("server error." + e.getMessage());
        }
    }
}

2.客户端

package com.lq.mypractice.activity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.lq.mypractice.R;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class SocketAndrodActivity extends AppCompatActivity {
    /**
     * Called when the activity is first created.
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_socket_androd);

        Button button = (Button) this.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                new SoketTask().execute();

            }
        });


    }

    private class SoketTask extends AsyncTask<Void, Integer, Integer> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Integer doInBackground(Void... params) {
            try {
                System.out.println("Client:Connecting");
                //IP地址和端口号(对应服务端),我这的IP是本地路由器的IP地址
                Socket socket = new Socket("192.168.205.46", 1234);
                //发送给服务端的消息
                String message = "Message from Android phone";
                try {
                    System.out.println("Client Sending: '" + message + "'");

                    //第二个参数为True则为自动flush
                    PrintWriter out = new PrintWriter(
                            new BufferedWriter(new OutputStreamWriter(
                                    socket.getOutputStream())), true);
                    out.println(message);
//                      out.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    //关闭Socket
                    socket.close();
                    System.out.println("Client:Socket closed");
                }
            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }
    }
}

3.测试

客户端:

05-30 11:28:46.302 18016-18802/com.lq.mypractice I/System.out: Client:Connecting
05-30 11:28:46.322 18016-18802/com.lq.mypractice I/System.out: Client Sending: 'Message from Android phone'
05-30 11:28:46.322 18016-18802/com.lq.mypractice I/System.out: Client:Socket closed

服务端:

server begin.............
server receiving.............
server received= Message from Android phone
server close.

参考链接

http://blog.csdn.net/ryantang03/article/details/8274517

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android tcp通信

  • 2016-11-08 12:32
  • 2.33MB
  • 下载

Socket 通信原理 -- Android客户端和服务器以TCP&&UDP方式互通

一、Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。 Http 是“请求—响应”方式,即在请求时建立连接通道,当客户端向服务器发送请求后...

Android基于socket的TCP通信

  • 2017-04-16 21:49
  • 303KB
  • 下载

Android TCP Socket通信封装

  • 2016-03-14 17:16
  • 2.62MB
  • 下载

PC和Android模拟器访问及模拟器之间tcp/udp通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。要想实现PC电脑和Android模拟器系统以及Android模拟器之间...

详细分析局域网内通过无线实现Android端与PC端TCP/UDP通信的四种情况

Android端与PC端在局域网(可以将两者放在同一个无线路由器下,wifi连接)内通过无线实现通信要分几种具体的情况分析,这里以TCP协议的Socket通信为例来具体说明: 1、Android真...

PC电脑和Android模拟器访问及模拟器之间tcp/udp通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。要想实现PC电脑和Android模拟器系统以及Android模拟器之间...
  • M_sdn
  • M_sdn
  • 2013-05-11 13:09
  • 816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)