Android端与服务端基于TCP/IP协议的Socket通信

Android端与服务端基于TCP/IP协议的Socket通讯

什么是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,代码如下:

public class SocketServer {
	//监听端口号
	private static final int SERVER_PORT = 12345;

	public static void main(String[] args) {
		try {
			System.out.println("Server: Connecting...");
			ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
			while (true) {
				//循环监听客户端请求
				Socket clientSocket = serverSocket.accept();
				System.out.println("Server: Receiving...");
				try {
					//获取输入流
					BufferedReader in = new BufferedReader(
							new InputStreamReader(clientSocket.getInputStream()));
					//获取从客户端发来的信息
					String str = in.readLine();
					System.out.println("Server: Received: '" + str + "'");
				} catch (Exception e) {
					System.out.println("Server: Error");
					e.printStackTrace();
				} finally {
					clientSocket.close();
					System.out.println("Server: Close.");
				}
			}

		} catch (Exception e) {
			System.out.println("Server: Error");
			e.printStackTrace();
		}
	}
}

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

Android端与服务端基于TCP/IP协议的Socket通信


然后是Android客户端的实现:

public class SocketAndrodActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Button button = (Button) this.findViewById(R.id.btn);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				try {
					System.out.println("Client:Connecting");
					//IP地址和端口号(对应服务端),我这的IP是本地路由器的IP地址
					Socket socket = new Socket("192.168.1.104", 12345);
					//发送给服务端的消息
					String message = "Message from Android phone";
					try {
						System.out.println("Client Sending: '" + message + "'");
						
						//第二个参数为True则为自动flush
						PrintWriter out = new PrintWriter(
								new BufferedWriter(new OutputStreamWriter(
										socket.getOutputStream())), true);
						out.println(message);
//						out.flush();
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						//关闭Socket
						socket.close();
						System.out.println("Client:Socket closed");
					}
				} catch (UnknownHostException e1) {
					e1.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
		});
	}
}

两个工程结构分别如下:

Android端与服务端基于TCP/IP协议的Socket通信


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

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

Android端与服务端基于TCP/IP协议的Socket通信


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

Android端与服务端基于TCP/IP协议的Socket通信


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

Android端与服务端基于TCP/IP协议的Socket通信


至此,就完成了一个简单的在Android端与Server利用TCP/IP协议进行通讯的Demo,涉及其中知识点与实现方式有不完备的地方希望大家指点并相互交流。Thanks~


源码:下载


对Android&IOS感兴趣的朋友可以加入我们的讨论QQ群,在这里,我们只讨论干货:

1群:220223507(已满)

2群:282552849


欢迎关注我的新浪微博和我交流:@唐韧_Ryan


1楼YSN1214昨天 22:10
很好 顶