基于Scoket的Android端与服务器端的通信实现

第一次写技术博客排版不太懂,见谅。

一、Socket通信介绍

Android与服务器的通信方式主要有两种,一是Http通信,一是Sock通信。两者最大的差异在于,http连接使用的是“请求-响应式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据传输,在连接时可以实现信息的主动推送,而不需要每次由客户端向服务器发送请求。

Socket分为TCP模式和UDP模式,本博客介绍TCP模式。

二、Socket的基本通信模型


TCP通信模型


三、基于TCP协议的Socket基本实现原理

服务器端流程:
创建套接字(Socket)
为Socket绑定IP地址和端口(Bind)
侦听来自客户端的请求(Listen)
等待(Accept)
利用返回的套接字与客户端实现通信(Send/Recv)
关闭Socket(Close)
Android端流程
创建套接字
发送连接请求(Connect)
通信(Send/Recv)
关闭

四、Socket通信实例

Android端

MainActivity.java
package com.buaa.socket;

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();
    }
    }
}
activity_main.xml

<?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>

服务器端

package com.bn.tw;
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();
}}}

五、注意事项以及体会。

作为初学者,Socket通信的原理和程序调试花了1.5天时间,由于对Eclipse使用不熟练,调试方法不懂,中途遇见了很多问题,比如程序没有打开网络权限,程序闪退,无法执行socket,Eclipse出现android.jar has no source attachment错误,等等。遇见的问题经过查书,查网,最终一一解决,在这个过程中不仅对Socket通信有了一定的掌握,而且对Android开发有了新的认识,对Eclipse的使用方法有了更加深入地了解。更重要的一点,遇到问题不要慌,静下心来找解决方法。
参考资料:《Android应用开发完全自学手册》、《重庆邮电大学移动互联工作室智能校园项目开发组指南 第四期 Socket通信》
http://blog.csdn.net/marking122/article/details/9108287解决android.jar has no source attachment问题
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值