Android开发socket通信——手机做server端C/S架构实现

每一部智能手机都是一部微型电脑,在学校里最喜欢的就是找上十个八个同学一起局域网内开几局dota,突然想到,拿手机C一个游戏来玩怎样,不用连wifi、不用开数据,几部手机选一个做主机,其他手机连上它的热点,便可以互动起来游戏搞起来了,多开心~~

实际实现过程中发现拿手机本身做server的手段还真是很少有人使用,网上也很少有现成的解决方案,经过一番摸索,简单实现了手机自身做server(可兼做客户端)的socket通信功能,写出来请大家指导一下,也是简单梳理一下方便日后复用。

遇到的最大问题可能是server端socket的阻塞问题,因为我们需要server端一直有socket处于监听状态,这样才能保证可以不断接受客户端的连接请求以及客户端发送的消息,进而广播给所有客户端机器。因此我们不能将serversocket放在MainActivity中,因为会阻塞app的运行,所以可以新建一个service,在service中定义serversocket的操作,在MainActivity中定义一个button,通过button启动service来打开server端。我的service代码如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;

public class ServerSocketService extends Service{

	private static ArrayList<Socket> socketList = new ArrayList<Socket>();
	private ServerSocket serverSocket = null;

	@Override
	public IBinder onBind(Intent intent){
		return null;
	}

	@Override
	public void onCreate(){
		super.onCreate();
	}

	@Override
	public void onDestroy(){
		super.onDestroy();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId){
		try{
			new Thread(new ServerThread()).start();
		}catch(Exception e){
			e.printStackTrace();
		}
		return START_STICKY;
	}

	public class ServerThread implements Runnable{

		private Socket socket = null;

		public ServerThread(){

		}		

		public void run(){			

			try{
				serverSocket = new ServerSocket(4567);
				while(true){
					socket = serverSocket.accept();
					socketList.add(socket);
					new Thread(new HandleInputMessageThread(socket)).start();
				}

			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}

	public class HandleInputMessageThread implements Runnable{
		private Socket socket = null;

		public HandleInputMessageThread(Socket sock){
			this.socket = sock;
		}

		public void run(){
			while(true){
				InputStream inputStream = null;
				try{
					inputStream = socket.getInputStream();
					byte data[] = new byte[1024*4];
					int i = 0;
					while((i = inputStream.read(data))!=-1){
						String buffer = null;
						buffer = new String(data,"gbk");
						buffer = buffer.trim() + "\n";
						OutputStream outputStream = null;

						for(Socket sock : socketList){
							outputStream = sock.getOutputStream();
							outputStream.write(buffer.getBytes("gbk"));
							outputStream.flush();
						}
						break;
					}
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}
}

客户端的实现就比较简单,客户端代码实现连接服务端功能以及发送消息数据等功能即可,此处不再贴出。

希望能对有需要的人有所帮助~路很长,慢慢飞

时间: 2024-10-05 16:03:46

Android开发socket通信——手机做server端C/S架构实现的相关文章

Android开发之控制手机音频

本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频,关于AudioManager的详解可参照:Android开发之AudioManager(音频管理器)详解 程序运行效果图: 实例代码: package com.jph.audiomanagerdemo; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import an

【Android开发-1】必做的事情,android开发环境搭建

前言:互联网移动端现在发展的速度越来越快了,各种App应用软件和手游的崛起,把移动端弄的丰富多彩:心情一激动,头脑一发热,就开始看视频.看书学习了.记得11年的时候有学习了下Android的开发,但是只是基础的学习了下,没认真深入学习.这次自己决定认真学习下,并用博客记录下,见证自己成长的过程. 一.准备工作 1.下载最新版jdk:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.下载Eclipse,选择Ec

解决mac上Android开发时出现的ADB server didn&#39;t ACK

mac 上adb连接不到android手机可以参考:这里 xxxdeMacPro:~ xxx$ adb start-server * daemon not running. starting it now on port 5037 * ADB server didn't ACK * failed to start daemon * 出现上面的情况,其中一种情况是其它软件占用了端口,可以 直接干掉占用端口的进程,怎么查看 google 一下方法,挺多的 还有一种就是坑了,我也找了好久,真是个大坑

(转)解决android开发人员,手机app图标显示不正确问题

android程序更换图标安装后不变解决办法 最近在搞android的时候发现,一开始程序使用系统默认图标,等到应用发布的时候要更换图标,结果在测试机上图标就是不变,其他手机和模拟器上都更新了图标. 测试机是小米,据说这个问题只在小米上会出现.网上查了原因说是miui会缓存图标,并且提供了两个解决方法 1.进入目录  /data/system/customized_icons 下,找到你原来的旧图标,删除即可.需要root权限 2.把当前的工程换一个包名,重新安装即可.换了包名等于是一个新的应用

Android之Socket通信、List加载更多、Spinner下拉列表

Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立socket连接,可为通信双方的数

Android简单Socket通信demo

一.Android Socket 通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信

Socket通信客户端和服务端代码

这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; usin

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

Android开发之获取手机SIM卡信息

TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设备上的电话服务信息. 应用程序能够使用这个类的方法来确定电话服务和状态,以及訪问某些类型的用户信息.应用程序还能够注冊一个侦听器以接收的电话状态变化通知. 你不能直接实例化这个类;相反,你能够通过Context.getSystemService(Context.TELEPHONY_SERVICE)方