第一次写技术博客排版不太懂,见谅。
一、Socket通信介绍
Android与服务器的通信方式主要有两种,一是Http通信,一是Sock通信。两者最大的差异在于,http连接使用的是“请求-响应式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据传输,在连接时可以实现信息的主动推送,而不需要每次由客户端向服务器发送请求。
Socket分为TCP模式和UDP模式,本博客介绍TCP模式。
二、Socket的基本通信模型
为Socket绑定IP地址和端口(Bind)
侦听来自客户端的请求(Listen)
等待(Accept)
利用返回的套接字与客户端实现通信(Send/Recv)
关闭Socket(Close)
四、Socket通信实例
Android端
import android.os.Bundle; //引入相关类
import android.app.Activity;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //设置当前屏幕
Button b=(Button)findViewById(R.id.btnPost);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { //重写onClick方法
connectToServer(); //连接服务端
}
});
}
public void connectToServer(){ //方法:连接客户端
String ip="115.28.143.212"; //服务端IP地址
try{
Socket sc=new Socket(ip,8080); //创建Socket连接
DataInputStream din=new DataInputStream(sc.getInputStream());//创建输入输出流对象
DataOutputStream dout=new DataOutputStream(sc.getOutputStream());
EditText et01=(EditText)findViewById(R.id.etPost); //获得EditText对象
dout.writeUTF(et01.getText().toString());//写入请求信息
EditText et02=(EditText)findViewById(R.id.etGet);
String msg = din.readUTF(); //读取服务端发来的消息
et02.setText(msg); //设置EditText对象
din.close(); //关闭输入输出流
dout.close();
sc.close(); //关闭Socket连接
}
catch(Exception e){ //捕获并打印异常
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:id="@+id/etPost"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="true"
android:cursorVisible="false"
/> <!-- 声明一个EditText控件 -->
<Button
android:id="@+id/btnPost"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="连接"
/> <!-- 声明一个Button控件 -->
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<EditText
android:id="@+id/etGet"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:editable="false"
android:lines="8"
android:cursorVisible="false"
/> <!-- 声明一个ScrollView控件 -->
</ScrollView>
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.buaa.socket"
android:versionCode="1"
android:versionName="1.0" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.buaa.socket.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>//网络访问权限
</manifest>
服务器端
import java.io.*;//引入相关类
import java.net.*;//引入相关类
public class Sample_12_1_Server{
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(8080);//创建ServerSocket对象,对指定端口进行监听
System.out.println("Listening on 8080......");
while(true){ //当为真时
Socket sc=ss.accept();//该方法为等待阻塞方法 用于响应客户端的连接的
DataInputStream din=new DataInputStream(sc.getInputStream());//创建输入输出流对象
DataOutputStream dout=new DataOutputStream(sc.getOutputStream());
System.out.println("客户端信息:"+din.readUTF());//从客户端获得信息
dout.writeUTF("这是Socket的一个小例子!!");//发给客户端信息
din.close();//关闭输出输入流
dout.close();
sc.close();}}//关闭此Socket连接
catch(Exception e){
e.printStackTrace();
}}}