Android TCP/IP Socket Test

TCP/IP协议Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。

Wikipedia的解释:TCP/IP协议,包含了一系列构成互联网基础的网络协议。这些协议最早发源于美国国防部的ARPA网项目。TCP/IP模型也被称作DoD模型(Department of Defense Model)。TCP/IP字面上代表了两个协议:TCP(传输控制协议)和IP(网际协议)。

W3Schools的解释:

TCP/IP is the communication protocol for communication between computers on the Internet.

TCP/IP stands for Transmission Control Protocol / Internet Protocol.

TCP/IP defines how electronic devices (like computers) should be connected to the Internet, and how data should be transmitted between them.

 

什么是Socket?

Socket是应用层与TCP/IP协议簇通讯的中间抽象层,Socket是一组接口,在设计模式中,Socket的设计就是门面模式,它把复杂的TCP/IP协议簇的内容隐藏在套接字接口后面,用户无需关心协议的实现,只需使用Socket提供的接口即可。

Socket的类型有两种,一种是面向连接的TCP应用服务,一种是面向无连接的UDP(User Data Package)应用服务。通俗的理解就是,TCP方式是打电话(连接性),UDP方式是发短信(无连接)。

 

Ok,以上是简单的科普,那么接下来就看下如何在Android上利用TCP/IP协议使用Socket与Server进行通讯吧!今天我们要使用的是面向连接的TCP方式。首先,在本机建立一个Java项目作为Server Client,代码如下:

 

  1. public class SocketServer {  
  2.     //监听端口号  
  3.     private static final int SERVER_PORT = 12345;  
  4.   
  5.     public static void main(String[] args) {  
  6.         try {  
  7.             System.out.println("Server: Connecting...");  
  8.             ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  
  9.             while (true) {  
  10.                 //循环监听客户端请求  
  11.                 Socket clientSocket = serverSocket.accept();  
  12.                 System.out.println("Server: Receiving...");  
  13.                 try {  
  14.                     //获取输入流  
  15.                     BufferedReader in = new BufferedReader(  
  16.                             new InputStreamReader(clientSocket.getInputStream()));  
  17.                     //获取从客户端发来的信息  
  18.                     String str = in.readLine();  
  19.                     System.out.println("Server: Received: ‘" + str + "‘");  
  20.                 } catch (Exception e) {  
  21.                     System.out.println("Server: Error");  
  22.                     e.printStackTrace();  
  23.                 } finally {  
  24.                     clientSocket.close();  
  25.                     System.out.println("Server: Close.");  
  26.                 }  
  27.             }  
  28.   
  29.         } catch (Exception e) {  
  30.             System.out.println("Server: Error");  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34. }  


服务端的简单实现就完成了,接下来新建一个Android客户端,布局效果就添加一个Button:

 


 

然后是Android客户端的实现:

 

  1. public class SocketAndrodActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.   
  8.         Button button = (Button) this.findViewById(R.id.btn);  
  9.         button.setOnClickListener(new OnClickListener() {  
  10.   
  11.             @Override  
  12.             public void onClick(View v) {  
  13.                 try {  
  14.                     System.out.println("Client:Connecting");  
  15.                     //IP地址和端口号(对应服务端),我这的IP是本地路由器的IP地址  
  16.                     Socket socket = new Socket("192.168.1.104"12345);  
  17.                     //发送给服务端的消息  
  18.                     String message = "Message from Android phone";  
  19.                     try {  
  20.                         System.out.println("Client Sending: ‘" + message + "‘");  
  21.                           
  22.                         //第二个参数为True则为自动flush  
  23.                         PrintWriter out = new PrintWriter(  
  24.                                 new BufferedWriter(new OutputStreamWriter(  
  25.                                         socket.getOutputStream())), true);  
  26.                         out.println(message);  
  27. //                      out.flush();  
  28.                     } catch (Exception e) {  
  29.                         e.printStackTrace();  
  30.                     } finally {  
  31.                         //关闭Socket  
  32.                         socket.close();  
  33.                         System.out.println("Client:Socket closed");  
  34.                     }  
  35.                 } catch (UnknownHostException e1) {  
  36.                     e1.printStackTrace();  
  37.                 } catch (IOException e) {  
  38.                     e.printStackTrace();  
  39.                 }  
  40.   
  41.             }  
  42.         });  
  43.     }  
  44. }  

 

两个工程结构分别如下:

 

代码部分就完成了,我的实验环境是在Wifi环境下,PC与Android手机都介入当前无线网路,所以程序里的IP地址是我实验环境无线的IP地址,大家要实验的话需要改成你们自己对应的IP地址。

然后是启动服务端,做了这么久Android,启动Java项目大家还没忘记吧(开玩笑),启动后看到下图这个小红点,就说明Server已经起来了,这个时候,Socket端口就一直处于监听状态了,知道客户端有请求过来。


 

这时,运行Android端的应用程序,点击布局中的按钮,消息就发出去了:


 

然后在服务端的输出日志中可以看到,已经接收到了来自Android端的数据请求,信息也顺利得到了:


 

至此,就完成了一个简单的在Android端与Server利用TCP/IP协议进行通讯的Demo.

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。