Android网络编程之Socket

Socket通常称为套接字,是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。应用程序通常通过套接字向网络发出请求或者应答网络请求。

★★★★★★Socket的基本操作:   

连接远程服务器、发送数据、接收数据、关闭连接、绑定端口、监听到达数据、在绑定端口上接受远程机器的连接。

服务器要和客户端通信,两者都要实例化一个Socket。服务器和客户端的Socket是不一样的,客户端可以实现连接远程机器、发送数据、接收数据、关闭连接等,服务器还需要实现绑定端口、监听到达的数据、接受来自远程机器的连接。Android在包java.net里面提供了两个类:ServerSocket和Socket,前者用于实例化服务器的Socket,后者用于实例化客户端的Socket。在连接成功后,应用程序两端都会产生一个Socket实例,操作这个实例完成客户端到服务器所需的会话。

★★★★★★Socket的构造函数代码举例:

package com.study.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    /**
     * @author 晓康 TCP客户端工作的主要步骤: ★调用Socket()创建一个流套接字,并连接到服务器端。
     *      ★★调用Socket类的getOutputStream()和getInputStream()方法获取输出和输入流,开始网络数据的发送和接收。
     *      ★★★关闭通信套接字。
     */
    
    // 0~1023端口为系统保留,用户设定的端口号应该大于1023
    private static final int TCP_SERVE_PORT = 50001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            // 初始化Socket,TCP_SERVE_PORT为指定的端口,int类型
            Socket socket = new Socket("localhost", TCP_SERVE_PORT);
            // 获取输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            // 生成输出流
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()));
            // 生成输出内容
            String outMsg = "Tcp connecting to" + TCP_SERVE_PORT
                    + System.getProperty("line.separator");
            // 写入
            out.write(outMsg);
            // 刷新,发送
            out.flush();
            // 获取输入流
            String inMsg = in.readLine() + System.getProperty("line.separator");
            Log.i("TcpClient", "received:" + inMsg);
            // 关闭连接
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

★★★★★★ServerSocket的构造函数代码举例:

package com.study.serversocket;

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

public class serversocket {
    /**
     * @author 晓康
     *            TCP服务器端工作的主要步骤 ★调用ServerSocket(int,port)创建一个ServerSocket,并绑定到指定端口上。
     *            ★★调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
     *            ★★★调用Socket类的getOutputStream()和getInputStream()获取输出和输入流,
     *                 开始网络数据的 发送和接收。
     */
    private static final int TCP_SERVER_PORT = 51001;
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        try {
            // TCP_SERVER_PORT为指定的绑定端口,为int类型
            serverSocket = new ServerSocket(TCP_SERVER_PORT);
            // 监听连接请求
            Socket socket = serverSocket.accept();
            // 写入读Buffer中
            BufferedReader in = new BufferedReader(new
                    // 获取输入流
                    InputStreamReader(socket.getInputStream()));
            // 放到写Buffer中
            BufferedWriter out = new BufferedWriter(new
                    // 获取输出流
                    OutputStreamWriter(socket.getOutputStream()));
            // 读取接收信息,转换成字符串
            String incomingMsg = in.readLine() + System.getProperty("line.separator");
            // 生成发送字符串
            String outgoingMsg = "goodbye from port " + TCP_SERVER_PORT + System.getProperty("line.separator");
            // 将发送字符串写入上面定义的BufferedWriter中
            out.write(outgoingMsg);
            // 刷新,发送
            out.flush();
            // 关闭
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 判定是否初始化ServerSocket对象,如果初始化则关闭serversocket
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

★★★★★★★无论是客户端还是服务端,都要在Android配置文件中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>


相关说明: ConsoleApplication1_sERVER ----PC-服务端 MyNetTest --------------------IOS-客户端 1、PC-服务端 只是一个运行在windows系统下的 控制台程序。接收来自客户端的信息。 2、IOS-客户端 运行在ios模拟器上,连接PC服务端的ip,发生相关信息。 3、两台主机,一台是运行windows系统的计算机。另外一台是MacBook计算机。运行ios模拟器。 4、pc-服务端,可以用vs2008打开并且编辑。 5、ios客户端,使用的是XamarinStudio 打开并且编辑。 以下是这个例子中的特别提到的地方 A、这个例子是完全用C#写的。 B、ios由于是伪后台,当程序退回到后台,系统留给程序的可运行时间就只有3分钟。 过了3分钟,就会把这个程序的所有线程挂起(当然内部预留了长任务运行这一后招)。 经过多次试验后,可以借助着3分钟的长任务运行,然后通过简单的修改来突破这个界限。 在本例子中,所有线程共享一个线程ID。 其中只需要一条线程负责不停的延长这个线程ID的运行时间,然后其他的线程就只需要专注于其本应该要做的任务即可。 C、本例子中,还实现了另外一个功能,就是ios程序与PC程序进行socket。当然是最为简单的。 ---------------- 由于本人也是刚刚使用c#开发ios程序,初入门,为了这两个问题,也是研究了很久,可查的资料又很少。 希望能够帮助到同样遇到困难的你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值