Android客户端利用Socket连接服务端思路及实例

Android客户端利用Socket连接服务器的大概思路如下:

客户端首次连接服务器:

socket = new Socket();  
    SocketAddress address = new InetSocketAddress(svrHost, svrPort);  
    socket.connect(address, TIME_OUT);  
    socket.setSoTimeout(TIME_OUT);  
    in = new BufferedReader(new InputStreamReader(  
            socket.getInputStream()));  
      
    out = new PrintWriter(new BufferedWriter(  
            new OutputStreamWriter(socket.getOutputStream())), true);

连接服务器之后,调用注册或者登录,获取连接的token。 以后每次的连接获取信息都要带上约定的token。

连接建立以后,socket不必关闭,毕竟每次connect也浪费资源,可以一直挂住等待服务端的推送或者心跳等消息。

while (!exitSocket) {  
    try {  
        if (!socket.isClosed() && socket.isConnected()  
                && !socket.isInputShutdown()) {  
            char[] lenBuffer = new char[13];  
            int len = 0;  
            try  {  
                len = in.read(lenBuffer);  
            } catch (Exception e) {  
                Utils.debug("SocketSvr socket read timeout");  
                stopSocketByException(true);  
            }

每次的请求,server端返回的数据都包含在lenBuffer中,一般是约定好的json或者是其他格式的信息。

整体思路是和TCP是一样的,更多的问题出现在细节处理上和socket的生命周期的维护上。

比如如果断网或者出现异常导致socket出现exception,这时可能需要把当前的socket关闭(timeoutException应该不需要重启),然后重新启动新的socket,但是对于终端用户来说,应当避免的是让用户感觉到有界面的异动,需要立即重新连接server。

Android客户端通过socket与服务器通信实例

由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别。只是UI代码不一样。

Android客户端通过socket与服务器通信分为下面5步:

(1)通过IP地址和端口实例化Socket,请求连接服务器;

socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321  

(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter

PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);     

这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。

(3)对Socket进行读写

out.println(message);  

(4)关闭打开的流

 out.close();  

完整工程代码如下:

package com.yarin.android.Examples_08_04;  
  
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.InputStreamReader;  
import java.io.OutputStreamWriter;  
import java.io.PrintWriter;  
import java.net.Socket;  
  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
import android.widget.TextView;  
  
public class Activity01 extends Activity  
{  
    private final String        DEBUG_TAG   = "Activity01";  
      
    private TextView    mTextView = null;  
    private EditText    mEditText = null;  
    private Button      mButton = null;  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        mButton = (Button)findViewById(R.id.Button01);  
        mTextView = (TextView)findViewById(R.id.TextView01);  
        mEditText = (EditText)findViewById(R.id.EditText01);  
          
        //登陆  
        mButton.setOnClickListener(new OnClickListener()  
        {  
            public void onClick(View v)  
            {  
                Socket socket = null;  
                String message = mEditText.getText().toString() + "/r/n";   
                try   
                {     
                    //创建Socket  
//                  socket = new Socket("192.168.1.110",54321);   
                    socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321  
                    //向服务器发送消息  
                    PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);        
                    out.println(message);   
                      
                    //接收来自服务器的消息  
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));   
                    String msg = br.readLine();   
                      
                    if ( msg != null )  
                    {  
                        mTextView.setText(msg);  
                    }  
                    else  
                    {  
                        mTextView.setText("数据错误!");  
                    }  
                    //关闭流  
                    out.close();  
                    br.close();  
                    //关闭Socket  
                    socket.close();   
                }  
                catch (Exception e)   
                {  
                    // TODO: handle exception  
                    Log.e(DEBUG_TAG, e.toString());  
                }  
            }  
        });  
    }  
}

布局文件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"  
    >  
    <TextView    
    android:id="@+id/TextView01"   
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="这里显示接收到服务器发来的信息"  
    />  
    <EditText   
    android:id="@+id/EditText01"   
    android:text="输入要发送的内容"   
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content">  
    </EditText>  
    <Button   
    android:id="@+id/Button01"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:text="发送"  
    />    
</LinearLayout>

AndroidManifest.xml文件如下

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="com.yarin.android.Examples_08_04"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".Activity01"  
                  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"></uses-permission>  
    <uses-sdk android:minSdkVersion="5" />  
</manifest>

当然,还有服务器端得代码

package com.yarin.android.Examples_08_04;  
  
import java.io.BufferedReader;  
import java.io.BufferedWriter;  
import java.io.InputStreamReader;  
import java.io.OutputStreamWriter;  
import java.io.PrintWriter;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class Server implements Runnable  
{  
    public void run()  
    {  
        try  
        {  
            //创建ServerSocket  
            ServerSocket serverSocket = new ServerSocket(54321);  
            while (true)  
            {  
                //接受客户端请求  
                Socket client = serverSocket.accept();  
                System.out.println("accept");  
                try  
                {  
                    //接收客户端消息  
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
                    String str = in.readLine();  
                    System.out.println("read:" + str);    
                    //向服务器发送消息  
                    PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);        
                    out.println("server message");   
                    //关闭流  
                    out.close();  
                    in.close();  
                }  
                catch (Exception e)  
                {  
                    System.out.println(e.getMessage());  
                    e.printStackTrace();  
                }  
                finally  
                {  
                    //关闭  
                    client.close();  
                    System.out.println("close");  
                }  
            }  
        }  
        catch (Exception e)  
        {  
            System.out.println(e.getMessage());  
        }  
    }  
    //main函数,开启服务器  
    public static void main(String a[])  
    {  
        Thread desktopServerThread = new Thread(new Server());  
        desktopServerThread.start();  
    }  
}

先开启服务器代码,

java  Server即可

然后启动android模拟器。运行结果

这是Android客户端。输入12345,点击发送:

这是服务器端收到的消息

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, edittext
, 服务器
, exception
, new
代码
socket客户端和服务端、socket 服务端 客户端、客户端和服务端的区别、客户端和服务端、服务端 客户端,以便于您获取更多的相关知识。

时间: 2024-08-04 13:50:03

Android客户端利用Socket连接服务端思路及实例的相关文章

服务器-笔记本没办法接收到android客户端的socket连接

问题描述 笔记本没办法接收到android客户端的socket连接 服务器是java写的,在笔记本上面运行.用java的客户端倒是可以连接,但是android写的就不行了.双方程序都是没问题的,台式机测试过. 试过用wifi连接,用网线连接都不行.还有一个问题就是在网上查的ip跟网络连接上面的ip完全不一样 解决方案 啥叫"在网上查的ip跟网络连接上面的ip完全不一样"?android的socket就是java里面滴.据你描述,问题可能出在ip上吧,另外端口也注意. 解决方案二: 你的

android客户端如何获取web服务端的xml文件

问题描述 我想要实现android客户端通过http连接的方式获取web服务端的xml文件,要怎么实现? 解决方案 程序入口 public static void getXMLForNet() { String httpPath = "填写您要获取xml数据的http地址,如果含有汉子则必须进行编码";String xml = getContent(httpParh, "UTF-8");FileOutputStream out = new FileOutputStr

.NET C/S结构 客户端通过Socket去服务端拿数据库的数据

问题描述 C端不直接访问数据库,C端通过Socket向S端发送指令,获取数据库的数据.如何实现一个函数stringSendCommand(stringCommand)即发送个获取个人信息的指令则返回个人信息的JSON数据.该函数发送请求的指令,返回服务器那边发回来的数据库数据.而不是数据都来源自Socket的Recv事件.同时,又需要Socket监听服务器端推送过来的消息. 解决方案 解决方案二:WCF和TCP长连接吗?解决方案三:我觉得读取数据库这种还是用webservice或者webapi好

java-使用socket通信服务端如何处理客户端请求

问题描述 使用socket通信服务端如何处理客户端请求 场景如下: 一个服务端,一个客户端通过socket连接服务端,假如客户端要请求服务端做一件事(如调用服务端A类的a方法), 因为socket传输的是字符串,所以我现在的做法是让客户端传一个标识符a到服务端,然后服务端 通过判断传过来的是a则调用A类的a方法, 如果我要执行A类的b方法,则传b过去再判断 我想问的是有没有更好的解决方案,或现成的框架可用 解决方案 如果你这样的需求,我觉得更适合HTTP.也许玩C++的更习惯于socket.之前

android开发-想用socket从服务端发送图片到客户端,但一直出错,求原因

问题描述 想用socket从服务端发送图片到客户端,但一直出错,求原因 开发-想用socket从服务端发送图片到客户端,但一直出错,求原因-socket客户端和服务端"> 如图所示,本人新人,求大神解答 解决方案 空指针从无,TestActivity的64行 解决方案二: 空指针 socket 不能执行关闭操作(其实是不能操作任何操作) 最好在操作前增加判断:if(null != socket) {} 在 {} 中做处理. 解决方案三: 应该是创建socket失败了. socket不能放在

求教socket异步编程中连接的一点问题,怎样实现客户端连不上服务端的时候一直去连接它

问题描述 假设现在客户要去连接服务端而此时服务端可能没开启或者其他其他原因造成客户端第一次或者前几次都不能够连接到,怎样使得客户在连接失败后继续连接它知道成功? 解决方案 解决方案二:up

socket通信-Socket通信 服务端还没有write完,客户端开始读取数据

问题描述 Socket通信 服务端还没有write完,客户端开始读取数据 Socket通信 服务端还没有write完,客户端开始读取数据,出现数据不完整的现象,如何保证客户端读取的数据完整性,切服务端发送一条客户端可以读取一条 解决方案 tcp连接等.

c++-libuv客户端开发,通过TCP/IP连接服务端出错!

问题描述 libuv客户端开发,通过TCP/IP连接服务端出错! 使用libuv进行客户端开发,在Linux下测试没有问题,当移植到win7下面就报错了,错误信息如下: 具体代码: ....... void uv_write_cb(uv_write_t *req,int status) { if(status == -1) { cout<<"error on_write_end"<<endl; return; } //cout<<"writ

VB.net Socket 一个服务端多个客户端如何实现消息互通呢?

问题描述 各位兄弟朋友,小弟我在一个项目中急需Socket通信功能,我一直搞不定多个客户端的事情,麻烦大家帮帮忙嘛.最好是有源码!感激不尽!!问题描述:1:服务端一个2:客户端多个3:每个客户端可单独给服务端发信息,服务端也可给当前客户端回复信息4:服务端可以向所有的客户端发送信息,也可以单独给某个客户端发送信息5:语言vb.net 解决方案 解决方案二:自己先顶一下!解决方案三:http://bbs.csdn.net/topics/370172131http://blog.csdn.net/l