Android Socket通信介绍和实例
Android Socket通信介绍和实例
Socket作用 :
Socket用于描述ip地址和端口,以及实现通信
Socket操作:
- 连接远程机器
- 发送数据
- 接收数据
- 关闭连接
- 绑定端口
- 监听数据到达
- 在绑定的端口上接收来自远程机器的连接
注意:服务端和客户端都需要实现Socket,但是实现方式不一样
客户端:实现连接远程机器,发送数据,接收数据,关闭连接
服务端:绑定端口,监听数据到达,在绑定的端口上接收来自远程机器的连接
通信模型图:
以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)
服务端实现步骤:
- 通过ServerSocket(int port);创建一个指定端口的ServerSocket
- 调用Accept()方法,等待客户端请求
- 根据Accept()方法返回的Socket实例,调用Socket的getInputStream()和getOutputStream()方法来获取数据和写入数据
- 调用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(); }}
更多相关文章
- [android盈利模式探索]我也分享一下我Android的收入数据
- Android开发之Jsoup解析webView加载数据
- Android Fragment内嵌Fragment页面不刷新数据问题
- android 测试读取LEB数据的函数
- android中在切换fragment时,怎样做到无需重复加载数据的方法。
- Android 将一个数据对象保存到本地以及读取的方法
- 自定义progressBar显示静态数据
- android之解析json数据格式详解