android客户端利用socket连接服务器_Android客户端利用Socket连接服务端思路及实例

更新时间:2019-12-07    来源:.Net开发    手机版     字体:

【www.bbyears.com--.Net开发】

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

  
  
      
      
      
        


AndroidManifest.xml文件如下


  
  
      
          
              
                  
                  
              
          
      
      
      


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


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,点击发送:

TCP_CLIENT


这是服务器端收到的消息


tcp_server

本文来源:http://www.bbyears.com/asp/82545.html

热门标签

更多>>

本类排行