Android中使用Socket来实现服务器端和客户端,进行数据通信(使用原生Socket)

1、服务器端的实现

服务器端需要通过ServerSocket来创建一个ServerSocket服务对象,然后通过accept()方法Socket对象获得来监听连接上来的客户端(这个方法是阻塞的),最后再对客户端发送过来的字节流进行读取。下面贴出我写的服务器端的代码,供参考:

<span style="white-space:pre">	</span>private static int PORT = 54327;//端口号
	private static List<Socket> mSocketList = new ArrayList<Socket>();//存放请求的客户端的Socket
	private ExecutorService mExcutorService;//一个线程池
	private ServerSocket mServerSocket;//Socket服务器端服务

下面是声明ServerSocket对象及监听客户端请求

try {
<span style="white-space:pre">	</span>mServerSocket = new ServerSocket(PORT);
	mExcutorService = Executors.newCachedThreadPool();//实例化线程池对象(一次执行所有线程)
	Socket client = null;
	while (true) {
		client = mServerSocket.accept();
		mSocketList.add(client);//将连接的客户端添加进集合
		mExcutorService.execute(new ThreadServer(client));//给每一个客户端开一个线程放进线程池中
	}
} catch (Exception e) {
	// TODO: handle exception
	e.printStackTrace();
} finally {
	try {
<span style="white-space:pre">		</span>mServerSocket.close();
	} catch (IOException e) {
	// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

定义一个线程类用来和客户端交互

static class ThreadServer implements Runnable {

		private Socket mSocket;
		private BufferedReader mBufferedReader;//用来读取客户端发来的数据
		private PrintWriter mPrintWriter;//用来写入信息发给客户端
		private String MSG = "ggg";

		public ThreadServer(Socket socket) throws IOException {
			this.mSocket = socket;
			mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "UTF-8"));
			mPrintWriter = new PrintWriter(mSocket.getOutputStream(), true);
			MSG = mBufferedReader.readLine();
			sendMessage();
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
			<span style="white-space:pre">	</span>while ((MSG = mBufferedReader.readLine()) != null) {//readLine()方法是阻塞的,当有数据流时执行,没有则阻塞
					sendMessage();//发送信息给客户端
				}
			} catch (Exception e) {

			} finally {

			}
		}
服务器将信息转发给所有客户端

private void sendMessage() throws IOException {
			for (Socket client : mSocketList) {
				mPrintWriter = new PrintWriter(client.getOutputStream(), true);
				mPrintWriter.println(MSG);
			}
		}


客户端的实现

新建一个线程,将网络处理放在其中,具体的用法注释中已经写明

new Thread(new Runnable() {

		@Override
		public void run() {
			try {
			<span style="white-space:pre">	</span>// TODO Auto-generated method stub
				mSocket = new Socket(mHost, mPort);//mHost为服务器地址,mPort和服务器的端口号一样
				mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())),true);//写入数据
				mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));//读取服务器发来的数据
				if (mSocket.isConnected()) {
					handler.sendEmptyMessage(2);
				}
				while (true) {
					if (!mSocket.isClosed() && mSocket.isConnected() && !mSocket.isInputShutdown() && mIn!=null
						) {
						if (null!=(textLine+=mIn.readLine())) {//读取数据
						<span style="white-space:pre">	</span>Message message = new Message();
							message.what = 1;
							message.obj = textLine;
							handler.sendMessage(message);
						}
					}
				}
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}).start();




版权声明:本文为android_hdh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。