安卓
Socket
通信详解
1>Socket
是什么:
也叫做
“
套接字
”用于描述
IP
地址和端口,在网络上的主机一般运行多个软件,提供多种服务,每种服务都会打开一个
Socket
,并绑定到一个端口上,不同端口对应不同服务
网络上的两个程序通过双向的通讯连接实现数据交换,,这个双向链路的一端称为一个
Socket
,
Socket
通常用于实现客户端和服务端的连接,
Socket
是
TCP/IP
协议的一个十分流行的网络编程,连接成功后,两端都会产生一个实例,操作这个实例,完成所需会话.
2>下面通过一个极其简单的
Demo
,演示最基本的
Socket
通信
【服务端代码:在指定端口
8989
监听客户端请求,一旦有请求,便执行操作,然后继续监听,使用
accept()
这个阻塞函数,该方法调用后一直等待客户端的请求,
直到有请求且连接到同一个端口,
accept()
返回一个对应于客户端的
Socket
,本例中很简单,服务端不断监听,一旦有请求就输出一段信息】
安卓
Socket
小
Demo
首先是服务器端代码
3>打开
eclipse
新建一个
java
工程
Main.java,这个就是服务器端的代码,
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by allan on 17-5-31.
* QQ Num: 1750398075
* CSDN Blog: http://blog.csdn.net/allan_bst
* Personal Website: http://mobiledream.top
* Personal Sina E-mail: jsp0369@163.com
*/
//Socket 服务端
public class Main {
private static final int PORT = 8989;
public static void main(String[] args) {
try {
// 实例化服务器套接字 设置端口号8989
ServerSocket server = new ServerSocket(PORT);
while (true) {
Socket socket = server.accept();
// 获取输出流
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
// 写字符串
writer.write("这是一段来自服务器的问候:Hello World!");
writer.flush();
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面代码很简单,循环监听8989端口,使用accept()这个阻塞函数,该方法调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket
4>下面是android客户端的相关内容,界面有一个按钮,点击后请求服务端的制定端口,然后显示服务端的内容
打开AndroidStudio,新建一个安卓工程
1)首先是MainActivity.java
点击按钮时,开启子线程,实例化Socket,传入ip和port
package com.example.allan.socketclient;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Created by allan on 17-5-31.
* QQ Num: 1750398075
* CSDN Blog: http://blog.csdn.net/allan_bst
* Personal Website: http://mobiledream.top
* Personal Sina E-mail: jsp0369@163.com
*/
//Socket
public class MainActivity extends Activity {
private TextView txt;
private String line;
private static final String HOST = "10.0.2.2"; //虚拟机的地址
private static final int PORT = 8989;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.text);
}
public void click(View view) {
new Thread() {
@Override
public void run() {
try {
// 实例化Socket
Socket socket = new Socket(HOST, PORT);
// 获得输入流
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
line = br.readLine();
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 执行完毕后给handler发送一个消息
handler.sendEmptyMessage(0);
}
}.start();
}
// 定义Handler对象
private Handler handler = new Handler() {
@Override
// 当有消息发送出来的时候就执行Handler的这个方法
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 处理UI
txt.setText(line);
Log.i("MSG", "收到消息----->" + line);
}
};
}
5>然后是activity_main.xml布局很简单,一个TextView 和一个 Button
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.allan.androidsockte.MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="30dp"
android:textSize="20sp"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:onClick="click"
android:id="@+id/btn_receive"
android:layout_width="368dp"
android:layout_height="wrap_content"
android:text="接收消息"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="8dp" />
</LinearLayout>
接下来是图片演示,首先运行Server端代码,Main.java
然后启动客户端,即可