现在的位置: 首页 > 综合 > 正文

android开发步步为营之6:客户端通过tcp和服务端进行交互

2017年10月06日 ⁄ 综合 ⁄ 共 6237字 ⁄ 字号 评论关闭

TCPTransmission
Control Protocol 
传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport
layer
)通信协议,由IETFRFC
793
说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

本文模拟客户端通过TCP向服务端发起登录请求来实现这一功能。

一、服务端

package com.figo.helloworld.action;

 

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;

 

/**

 * 服务端Tcp登录接口,接收客户端登录请求

 *

 * @author zhuzhifei 版权所有

 *

 */

public class TcpAction implements Runnable
{

 

    /**

     * @param args

     */

    public static void main(String[] args)
{

       // TODO Auto-generated
method stub

       System.out.println("start");

       Thread
desktopServerThread = 
new Thread(new TcpAction());

       desktopServerThread.start();

    }

 

    public void run()
{

       try {

           // 创建ServerSocket

           ServerSocket
serverSocket = 
new ServerSocket(8088);// 设置8088端口

           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);

                  if ("123|abc".equals(str))
{

                     out.println("server
message:"
 + "login
success"
);

                  } else {

                     out.println("server
message:"

                            + "userName
or password is error"
);

                  }

                  // 关闭流

                  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());

       }

    }

}

二、客户端

 

package com.figo.helloworld;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.InetSocketAddress;

import java.net.Socket;

import java.net.SocketTimeoutException;

 

import org.apache.http.conn.ConnectTimeoutException;

 

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;

 

/**

 * 这个Activity模拟使用Socket通信来调用服务端的登录接口

 *

 * @author zhuzhifei 版权所有

 *

 */

public class TcpActivity extends Activity {

 

         Button
buttonLogin;

         EditText
etUserName;

         EditText
etPwd;

         TextView
tvResult;

 

         @Override

         protected
void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.tcptest);

                   buttonLogin
= (Button) findViewById(R.id.buttonLogin);

                   etUserName
= (EditText) findViewById(R.id.etUserName);

                   etPwd
= (EditText) findViewById(R.id.etPwd);

                   tvResult
= (TextView) findViewById(R.id.tvResult);

                   buttonLogin.setOnClickListener(new
OnClickListener() {

 

                            @Override

                            public
void onClick(View v) {

                                     Socket
socket = null;

                                     String
message = etUserName.getText().toString() + "|"

                                                        +
etPwd.getText().toString();

                                     try
{

                                               // 创建Socket

                                               socket
= new Socket();

                                               socket.connect(new
InetSocketAddress("10.241.72.35", 8088),

                                                                 30000);//
30
秒钟连接超时

                                               socket.setSoTimeout(30000);//
30
秒钟通信超时

                                               socket.setTcpNoDelay(true);

                                               // 向服务器发送消息

                                               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) {

                                                        tvResult.setText(msg);

                                               }
else {

                                                        tvResult.setText("数据错误!");

                                               }

                                               // 关闭流

                                               out.close();

                                               br.close();

                                               // 关闭Socket

                                               socket.close();

                                     }
catch (ConnectTimeoutException e) {

                                               Log.e("tcp",
e.toString());

                                     }
catch (SocketTimeoutException e) {

                                               Log.e("tcp",
e.toString());

                                     }
catch (Exception e) {

                                               Log.e("tcp",
e.toString());

                                     }

                            }

                   });

         }

}

抱歉!评论已关闭.