Android Socket通信介绍和实例

Socket作用 :

Socket用于描述ip地址和端口,以及实现通信

Socket操作:

  1. 连接远程机器
  2. 发送数据
  3. 接收数据
  4. 关闭连接
  5. 绑定端口
  6. 监听数据到达
  7. 在绑定的端口上接收来自远程机器的连接

注意:服务端和客户端都需要实现Socket,但是实现方式不一样

客户端:实现连接远程机器,发送数据,接收数据,关闭连接

服务端:绑定端口,监听数据到达,在绑定的端口上接收来自远程机器的连接


通信模型图:

Android Socket通信介绍和实例_第1张图片



以TCP通信为实例

客户端Socket

客户端可以使用Socket的构造器来连接到指定的服务器,我们常用如下两个构造方法

  • Socket(InetAddress/String remoteAddress , int port);创建连接到指定的远程主机,远程端口的Socket,没有指定本地的地址和端口,所以使用本地主机默认的ip地址,使用系统动态分配的端口
  • Socket(InetAddress/String remoteAddress ,int port ,InetAddress localAddress ,int localport) ;创建连接远程主机,远程端口的Socket,并且指定本地的ip地址和端口,适用于本地多ip地址的情况

例如:

//创建Socket,连接到指定的主机和端口Socket socket = new Socket("113.250.156.35" , 30001);

客户端Socket重要方法:

public InputStream getInputStream() //读出Socket数据

public OutputStream getOutputStream() //向Socket写入数据

public Synchronized void close() //关闭该Socket


服务端ServerSocket:

服务端的常用的构造方法有

  • ServerSocket(int port);构造一个指定端口的ServerSocket,此时队列数目为50
  • ServerSocket(int port , int backlog);//构造一个指定端口和队列数目的ServerSocket
  • ServerSocket(int port , int backlog , InetAddress localaddress);//当机器有多个IP地址的时候,可以调用该构造方法来指定需要绑定的ip地址,端口,队列数目

服务端ServerSocket重要方法

public Socket accept();等待客户端的请求,并且返回Socket实例。

运用方法:我们可以通过accept()方法返回的Socket实例,操作传递的信息

public void close();关闭该服务器的ServerSocket 一般不用


实例(demo)

服务端实现步骤:

  1. 通过ServerSocket(int port);创建一个指定端口的ServerSocket
  2. 调用Accept()方法,等待客户端请求
  3. 根据Accept()方法返回的Socket实例,调用Socket的getInputStream()和getOutputStream()方法来获取数据和写入数据
  4. 调用close()方法关闭Socket实例

PS1:建议把ServerSocket放在单独的线程中处理,因为实际的项目中肯定要处理很多客户端的请求,我们不可能都在主线程中一一等待客户端请求,然后处理

PS2:为了可以直接在PC机上运行,该程序不需要建立Android项目,我们直接用Eclipse建立一个JAVA项目,然后运行该程序,那么服务就会启动,我们再去启动客户端Socket就可以了

import java.io.IOException;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class ServiceTest {  private static ServerSocket  serverSocket;  private static MyThread myThread;  public static void main(String[] args) throws IOException  {    myThread = new MyThread() ;    myThread.start();//    System.out.println("Hello World!");       }  public static class MyThread extends Thread  {  @Override  public void run()  {  try {//步骤一:通过ServerSocket(int port);创建一个指定端口的ServerSocketserverSocket = new ServerSocket(30001) ;} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}  while(true)    {  try {    //步骤二:调用Accept()方法,等待客户端请求    Socket socket = serverSocket.accept() ;    //步骤三:根据Accept()方法返回的Socket实例,    //调用Socket的getInputStream()和getOutputStream()方法来获取数据和写入数据    OutputStream os = socket.getOutputStream();                                        os.write("您好,您收到了服务器发送消息! \n".getBytes("utf-8"));    os.close();    //步骤四:调用close()方法关闭Socket实例    socket.close();        }catch(IOException e)  {  e.printStackTrace();  }catch(Exception e)  {  e.printStackTrace();  }        }  }  }}

客户端实现步骤:

1,在AndroidManfest.xml文件中申明权限:访问网络的权限

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

2,在Activity中实现一个线程,用来启动Socket。不能再UI线程中定义Socket访问网络

3,用Socket(String dstName , int port);创建指定主机ip和端口的Socket

4,调用Socket的getInputStream()和getOutputStream()获取数据和写入数据

5,调用close()关闭连接


为了测试:我在之前的服务端代码中定义了:

 OutputStream os = socket.getOutputStream(); os.write("您好,您收到了服务器发送消息! \n".getBytes("utf-8"));

那么我们现在需要再客户端接收该数据并且显示,那么我们在XML布局文件中定义一个TextView,在JAVA业务代码中获取该组件,当收到服务器的消息时,我们就把TextView的内容设置服务器传递给我们的内容:


注意:因为我们访问本机,所以我们需要知道本机ip,建议打开百度搜ip,直接可以获取。另外,因为是访问本PC机,所以不能用真机模拟,直接用模拟器就可以了

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;import java.net.UnknownHostException;public class MainActivity extends AppCompatActivity {    private TextView textView ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView)findViewById(R.id.textViewId) ;        //启动线程        new Thread()        {            @Override            public void run() {                super.run();                Socket socket;                try {                    //创建Socket                    socket = new Socket("113.250.156.35" , 30001);                    //设定5秒时间网络网络等待                    socket.setSoTimeout(5 * 1000);                    //读取服务端的消息                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;                    String str = in.readLine() ;                    //将textview的内容设置为服务端返回的消息                    textView.setText(str);                    //关闭连接                    socket.close();                }catch (UnknownHostException e)                {                    e.printStackTrace();                }catch (IOException e)                {                    e.printStackTrace();                }catch (Exception e)                {                    e.printStackTrace();                }            }        }.start();    }}


更多相关文章

  1. [android盈利模式探索]我也分享一下我Android的收入数据
  2. Android开发之Jsoup解析webView加载数据
  3. Android Fragment内嵌Fragment页面不刷新数据问题
  4. android 测试读取LEB数据的函数
  5. android中在切换fragment时,怎样做到无需重复加载数据的方法。
  6. Android 将一个数据对象保存到本地以及读取的方法
  7. 自定义progressBar显示静态数据
  8. android之解析json数据格式详解

随机推荐

  1. android listview 中使用EditText 防止数
  2. 友盟统计 集成测试看不到实时日志
  3. Android(安卓)dialog,activity 屏蔽Home
  4. Android之异步任务AsyncTask解析Json数据
  5. Android(安卓)网络存储的例子
  6. 安卓学习路线参考
  7. gradle配置参数详解
  8. android窗体透明的,黑暗度等的设置技巧
  9. Android模拟器使用KSOAP2调用WebService
  10. 最近开发Android的一些总结