Android上JAVA Socket通信解析(一)初识socket通信

来源:互联网 发布:淘宝可以上闲鱼吗 编辑:程序博客网 时间:2024/06/05 11:21

1.简介

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP通信协议在通信的两端各建立一个Socket,从而在通信的两端之间形成虚拟链路,一旦建立了虚拟链路,两端的程序就能够通过虚拟链路进行通信。
Java语言对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信接口,并通过Socket产生IO流来进行网络通信,输入流:InputStream读取数据,输出流:OutputStream写入数据;
Android上JAVA <wbr>Socket通信解析(一)初识socket通信
Socket通信的模型示意图;
下面就将进行进行socket通信的实战演示;

2 .  简单的客户端/服务器端socket通信

Java中使用ServerSocket来监听客户端Socket的连接,如果没有连接,则一直处于等待状态;本例子演示的是在同一个主机上,故服务器使用的笔记本,服务器地址使用的本机IP;
代码如下:
    public static void main(String[] args)    {                // TODO Auto-generated method stub        try        {            ServerSocket ss = new ServerSocket(3000);            while (true)            {                                Socket s = ss.accept();//                InputStream in = s.getInputStream();                String msg = "你好,收到服务器的祝福:"+Math.random()*10;                                OutputStream os = s.getOutputStream();                os.write(msg.getBytes("utf-8"));                os.close();                s.close();            }                    } catch (IOException e)        {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

3.   客户端请求数据

客户端比较简单,使用Android的一个普通acitivity中,点击button开启一个线程连接服务器端,读取服务器的数据,获取到数据后,弹出一个toast并显示;
其中Android中的AndroidManifest.xml中需要申请网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>

AndroidManifest.xml文件如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"          package="com.anana.sockettest">    <uses-permission android:name="android.permission.INTERNET"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>        </activity>    </application></manifest>

4,xml布局文件内容

代码如下:
<?xml version="1.0" encoding="utf-8"?><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"    tools:context="com.anana.sockettest.MainActivity">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical">        <Button            android:id="@+id/request"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="请求服务器"            />    </LinearLayout></LinearLayout>

5.activity代码内容

activity中代码,监听button按钮的click事件,响应事件后,开启一个线程,向服务器请求数据,并弹toast显示获取的内容;
代码如下:
    public class MainActivity extends AppCompatActivity{    private static final String TAG = "socket";    Button request;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        request = (Button) findViewById(R.id.request);        request.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View view)            {                Log.e(TAG, "start request");                startRequest();            }        });     }    //本机ip地址,麻烦修改为自己的ip    private static final String SERVER_IP = "192.168.23.104";    private static final int PORT = 3000;    private void startRequest()    {        new Thread(new Runnable()        {            @Override            public void run()            {                try                {                    //两种建立socket的方式,一种使用connect,一种指定访问端口                    Socket s = new Socket();                    //指定访问ip和端口//                    Socket s = new Socket(SERVER_IP, PORT);                    s.connect(new InetSocketAddress(SERVER_IP, PORT), 5000);                    s.setSoTimeout(5000);                    //读取数据的方式,一种使用BufferedReader,一种使用Scanner//                    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream//                            ()));                    Scanner scan = new Scanner(s.getInputStream());                    final String line = scan.nextLine();                    runOnUiThread(new Runnable()                    {                        @Override                        public void run()                        {                            Log.e(TAG, "s request result");                            Toast.makeText(MainActivity.this, line, Toast.LENGTH_SHORT).show();                        }                    });                    scan.close();                    s.close();                }                catch (ConnectException e)                {                    tiemout(e);                }                catch (SocketTimeoutException e)                {                    tiemout(e);                }                catch (IOException e)                {                    e.printStackTrace();                }            }        }).start();    }}

关于服务器和客户端的多线程通信的例子可以参考文章:Android上JAVA Socket通信解析(二)多线程通信




原创粉丝点击