Android之简单Socket编程

转载请注明出处:http://blog.csdn.net/joker_ya/article/details/40214627

最近呢,比较烦。快要毕业了,各种事情堆压过来。让人有点喘不过气来,刚好今天有点空就写下了这篇有关Socket编程的博客。由于时间匆忙没有好好去弄,因此该应用非常简单,大家看看就好了。嘛!最主要的还是原理。只要弄懂了原理编写有关Socket方面的不是得心应手!


Socket :Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。


Socket简介(百度百科):Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

Socket 连接过程(百度百科):根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
重要的Socket API:
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
.Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
.getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。

.getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

讲了那么多原理了,接下来就一起做个Demo来加深印象和理解吧!

首先编写服务器端代码SocketServer.java(该类是Java应用):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务类
 * 
 * @author Joker_Ya
 * 
 */
public class SocketServer {
	// 端口号
	private static final int PORT = 5252;
	// ServerSocket类
	private ServerSocket mServerSocket;
	private Socket mSocket;
	private BufferedReader in;

	// private PrintWriter out;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new SocketServer();
	}

	public SocketServer() {
		super();
		// TODO Auto-generated constructor stub
		try {
			mServerSocket = new ServerSocket(PORT);
			System.out.println("------Server Satrted------");
			mSocket = mServerSocket.accept();
			in = new BufferedReader(new InputStreamReader(
					mSocket.getInputStream()));
			// out = new PrintWriter(mSocket.getOutputStream(), true);
			String line = in.readLine();
			System.out.println("you sent is " + line);
			// out.close();
			in.close();
			mSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

接下来新建Android工程项目SocketDemo,目录如下:

Android之简单Socket编程_第1张图片

界面布局很简单,这里就不给出来了。界面只含有一个TextView、一个EditView和一个Button。Button用于将用户输入到EditView里的内容用Socket发送出去,服务器接收到内容后在控制台打印内容。

主Activity文件MainActivity.java:

package com.example.sockitdemo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * 客户端
 * 
 * @author Joker_Ya
 * 
 */
public class MainActivity extends ActionBarActivity {

	private EditText mEditText;
	private Button mButton;
	private static final String HOST = "222.17.106.37";
	private static final int PORT = 5252;
	private Socket socket;
	private PrintWriter out;
	// private BufferedReader in;
	private String getText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mEditText = (EditText) findViewById(R.id.editText);
		mButton = (Button) findViewById(R.id.send_bt);
		//开启新线程访问网络,否则会报错
		new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					socket = new Socket(HOST, PORT);
					// in = new BufferedReader(new InputStreamReader(
					// socket.getInputStream()));
					out = new PrintWriter(new BufferedWriter(
							new OutputStreamWriter(socket.getOutputStream(),
									"utf-8")), true);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
		// 按钮点击事件
		mButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				getText = mEditText.getText().toString();
				if (socket.isConnected()) {
					if (!socket.isOutputShutdown()) {
						out.println(getText);
					}
				}
			}
		});
	}
}


最后不要忘了在清单文件中加入访问网络的权限:


嗯,基本上都弄完了。来看看效果吧!!

首先运行服务器文件SocketServer.java,运行后会在控制台出现如下图所示内容:

Android之简单Socket编程_第2张图片

该图说明服务器已经启动。接下来运行Android应用SocketDemo,并在输入框输入内容和发送内容。如下图:

Android之简单Socket编程_第3张图片

当点击“发送”按钮时,可以在控制台查看是否得到了内容和打印出内容:

Android之简单Socket编程_第4张图片


好了,一个简单的Socket应用就完成了。大家理解其原理了没有?!ps:由于没有设置编码格式。所以当输入中文时,控制台打印的是乱码。而且也没有循环监控,所以只打印一次。匆忙之中赶的,望谅解!!谢谢



你可能感兴趣的:(Android)