`
何先生
  • 浏览: 26443 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

利用wifi在同一个局域网下实现两部手机之间的通讯

阅读更多



需要用到的权限
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

service端
public class MainActivity extends Activity {
	private Button start = null;
	private EditText bufferText = null;
	private Button send = null; 
	private ServerThread serverThread = null;
	private String sendBuffer = null;
	private String receiveBuffer = null;
	private TcpSocketServer tss = null;
	private TextView receiveView = null;

	private Handler handler = new Handler(){//线程与UI交互更新界面
		public void handleMessage(Message msg){			  
			receiveView.setText(receiveBuffer);
			Toast.makeText(MainActivity.this, receiveBuffer, Toast.LENGTH_SHORT).show();
		}
	};
	private String intToIp(int i) {                    
		return (i & 0xFF ) + "." +          
				((i >> 8 ) & 0xFF) + "." +           
				((i >> 16 ) & 0xFF) + "." +            
				( i >> 24 & 0xFF) ;   
	}
	protected void onCreate(Bundle savedInstanceState) {		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//获取wifi服务       
		WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		//判断wifi是否开启      
		if (!wifiManager.isWifiEnabled()) {        
			wifiManager.setWifiEnabled(true);         
		}       
		WifiInfo wifiInfo = wifiManager.getConnectionInfo();            
		int ipAddress = wifiInfo.getIpAddress();         
		String ip = intToIp(ipAddress);
		TextView tv=(TextView) findViewById(R.id.ip);
		tv.setText("本机IP:"+ip);
		receiveView = (TextView)this.findViewById(R.id.receiveID);
		start = (Button) this.findViewById(R.id.startID);

		//监听服务器开启
		start.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {				
				if(serverThread == null){
					EditText portEditText = (EditText)MainActivity.this.findViewById(R.id.portID);
					String port = portEditText.getText().toString().trim(); 
					serverThread = new ServerThread(port);
					serverThread .start();				
					Toast.makeText(MainActivity.this, port, Toast.LENGTH_SHORT).show();
				}							
			}});


		send = (Button)this.findViewById(R.id.sendID);
		bufferText = (EditText)this.findViewById(R.id.bufferID);

		//监听发送信息
		send.setOnClickListener(new OnClickListener() {						
			public void onClick(View v){
				sendBuffer = bufferText.getText().toString().trim(); 
				if(sendBuffer != null)//为了避免线程把它弄为buffer = null;
					Toast.makeText(MainActivity.this, sendBuffer, Toast.LENGTH_SHORT).show();
			} 
		}); 
	} 
	class ServerThread extends Thread{
		private int port;
		public ServerThread (String port){
			this.port = Integer.parseInt(port);  		
		}
		public void run(){
			//建立服务端
			if(tss == null)
				tss = new TcpSocketServer(this.port);
			new Thread(new WriteThread()).start();//开启“写”线程
			new Thread(new ReadThread()).start();//开启“读”线程
		}
		private class ReadThread implements Runnable{

			public void run(){			
				while(true){
					if((receiveBuffer = tss.getMessage()) != null){//收到不为null的信息就发送出去
						handler.sendEmptyMessage(0);						
					}
				}
			}
		}
		private class WriteThread implements Runnable{
			public void run(){
				while(true){
					try {
						//发送数据
						if(sendBuffer != null){
							//tss.sendMessage(1821,buffer);
							tss.sendMessage(sendBuffer);
							sendBuffer = null;//清空,不让它连续发
						}								
					} catch (Exception e) {
						e.printStackTrace();
					}	
				}
			}
		}
	}
}

public class TcpSocketServer {
	private ServerSocket ss =null;	
	private Socket s = null;
	private OutputStream out = null;
	private InputStream  in  = null;
	private String receiveBuffer = null; 
	public TcpSocketServer(int port){
		//新建ServerSocket对象,端口为传进来的port;		
		try {
			//ss= new ServerSocket(1821);
			System.out.print("no");
			ss = new ServerSocket(port);
			System.out.print("yes");
			s = ss.accept();
			out = s.getOutputStream();
			in  = s.getInputStream(); 
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void sendMessage(String buffer)throws Exception{
		//新建Socket通信对象,接受客户端发来的请求accept();
		//Socket s = ss.accept();
		//创建输入流对象InputStream
		InputStream bais = new ByteArrayInputStream(buffer.getBytes());		
		byte[] buff = new byte[1024];		
		bais.read(buff);
		out.write(buff);
		out.flush();						
	}
	public String getMessage(){
		byte[] temp = new byte[1024];
		try{
			if(in.read(temp) > 0)
			{
				return receiveBuffer = new String(temp).trim();				
			}} catch (IOException e) {			
			e.printStackTrace();
		}
		return null;
	}
	public String receiveMessage(){
		return null;
	}
}


client端
public class MainActivity extends Activity {

	private EditText ipEdit 	 = null;
	private EditText portEdit 	 = null;
	private EditText buffEdit 	 = null;
	private Button   startButton = null;
	private Button   sendButton  = null;
	private TextView receiveView = null;
	private Socket s = null;	
	private byte[] receiveBuffer = new byte[1024];
	private String sendBuffer = new String();
	private String ip = null;
	private int port ;
	private int cmdCount = 0; 
	  
	private Handler handler = new Handler(){//线程与UI交互更新界面
		public void handleMessage(Message msg){			  
			receiveView.setText(new String(receiveBuffer).trim());
			Arrays.fill(receiveBuffer, (byte)0);//清空
		}
	};
	

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);				 		
		
		this.init();
		/*开启socket通信*/
		startButton.setOnClickListener(new OnClickListener() {					
			public void onClick(View v) {			
				if(s == null){//这里要设置验证!!!!!!!!!	
					/*设定ip和port*/
					ip = ipEdit.getText().toString();
					port = Integer.parseInt(portEdit.getText().toString());
					/*开启socket线程*/
					new Thread(new SocketClientControl(ip,port)).start();					
				}								
				Toast.makeText(MainActivity.this, "服务器连接成功", Toast.LENGTH_SHORT).show();
			} 
		}); 		
		/*发送数据*/
		sendButton.setOnClickListener(new OnClickListener(){					
			public void onClick(View v) {
				if(s != null)
					sendBuffer = buffEdit.getText().toString();
					Toast.makeText(MainActivity.this, "send -> "+sendBuffer, Toast.LENGTH_SHORT).show();
				}							
			}); 
	}		
	private void init(){
		startButton = (Button) this.findViewById(R.id.startID);
		sendButton  = (Button) this.findViewById(R.id.sendID);
		ipEdit 	    = (EditText) this.findViewById(R.id.ipID);
		portEdit 	= (EditText) this.findViewById(R.id.portID);
		buffEdit 	= (EditText) this.findViewById(R.id.buffID);		 
		receiveView = (TextView) this.findViewById(R.id.recieiveID);
	}
	private class SocketClientControl implements Runnable{
		private InputStream  in  = null;
		private OutputStream out = null;
		public SocketClientControl(){
			
		}
		public SocketClientControl(String ip,int port){
			try { 
				s = new Socket(ip,port);//获得链接
				in  = s.getInputStream();//获得输入流
				out = s.getOutputStream();//获得输出流
			} catch (IOException e) { 
				e.printStackTrace();
				System.exit(-1);//要是出问题,就线程退出
			}			 			
		}
		public void run(){
			new Thread(new WriteThread()).start();//开启“写”线程
			new Thread(new ReadThread()).start();//开启“读”线程
		}
		private class ReadThread implements Runnable{			
			public void run() {
				while(true){
					try {					 
						if(in.read(receiveBuffer) > 0){//等待命令的输入
							cmdCount ++;				;
							handler.sendEmptyMessage(0);//发送信息,更新UI										
						}						
					} catch (IOException e) {
						e.printStackTrace();					
					}
				}
			}			
		}		
		private class WriteThread implements Runnable{
		
			public void run(){
				while(true){				
					if(!sendBuffer.equals("")){
						try {
							out.write(sendBuffer.getBytes());//输出
							out.flush();//输出刷新缓冲
						} catch (IOException e) {
							e.printStackTrace();
						}			
						sendBuffer = "";
					} 
				}													
			}
			
		}

	}
}

public class SocketClientSingle {
	private static Socket s = null;
	private SocketClientSingle()
	{
		
	}
	public static Socket getSocket(String ip,int port){
		try {
			s = new Socket(ip,port);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return s; 
	}

}
  • 大小: 30.5 KB
  • 大小: 38.1 KB
分享到:
评论

相关推荐

    局域网内实现WIFI的两种方法

    ### 局域网内实现WIFI的两种方法详解 #### 方法一:通过WAN口连接无线路由器实现WIFI功能 **第一步:物理连接** - 将一根网线从局域网内的交换机接入无线路由器的WAN口。 - 另一根网线连接计算机到无线路由器的...

    手机wifi局域网传递文件范例

    在同一个局域网内的设备可以通过TCP/IP协议进行通信。TCP(传输控制协议)负责确保数据的可靠传输,IP(互联网协议)则负责将数据包从一个设备路由到另一个设备。常见的文件传输协议有FTP(文件传输协议)、HTTP(超...

    wifi局域网内双向语音实时通话

    在现代技术领域,WiFi局域网内的双向语音实时通话已经成为日常生活和..."wifi下双向语音通讯.apk"这样的应用程序就是这一技术的具体体现,它将这些知识点融入到实际产品中,让用户能够轻松享受到高质量的语音通话体验。

    Android实现两个手机间的通讯

    在Android平台上实现两个手机间的通信是一项常见的需求,可以用于数据共享、实时聊天或者协同操作等场景。本篇文章将深入探讨如何实现这样的功能,主要涉及以下几个关键知识点: 1. **蓝牙通信**:Android提供了...

    利用UDP实现局域网通信

    【标题】"利用UDP实现局域网通信"的知识点涵盖了两个主要方面:UDP协议和局域网通信。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,常用于实时数据传输,如音频、视频流媒体,因为它的低延迟...

    Android WIFI局域网传文件

    可以实现手机之间连接WIFI情况下局域网实时传送文件,支持自建WIFI热点

    安卓双机(两个手机)wifi下socket通信(client输入,在server端显示)

    1:两个手机需要在同一个局域网里面 2:修改客户端ClientTest里面的IP地址,IP地址设置为作为服务端的手机的IP地址 3:androidSocketTest 为服务端,要安装到一个手机里并先运行起来,会显示本机IP地址,显示Client传...

    本项目是一个安卓手机之间通过wifi通讯的项目源码包括安卓客户端源码和安卓服务端源码。需要两个安卓端都在一个局域网内并且先启动服务端两台手机wifi互连.rar

    本项目是一个安卓手机之间通过wifi通讯的项目源码包括安卓...需要两个安卓端都在一个局域网内并且先启动服务端两台手机wifi互连.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android基于局域网socket通信

    在Android平台上,实现基于局域网的Socket通信是一项常见的任务,尤其在开发涉及设备间通信的应用时。Socket通信允许两台设备通过网络连接直接交换数据,而无需中间服务器。在这个项目中,我们关注的是Android设备...

    android基于socket两个手机之间进行通信

    在本场景中,"android基于socket两个手机之间进行通信"意味着我们需要在两台Android设备上建立TCP连接,共享局域网内的IP地址来实现数据交互。 首先,理解Socket的基本概念至关重要。Socket分为服务器端...

    Android手机通过wifi实现数据传输

    在现代移动设备中,尤其是Android手机,通过Wi-Fi进行数据传输已经成为日常生活和工作中不可或缺的一部分。Wi-Fi技术不仅用于网络连接,还可以实现设备间的短距离数据共享。本文将深入探讨如何利用Android系统的架构...

    WiFi热点 局域网虚拟WiFi

    "WiFi热点 局域网虚拟WiFi"这个标题所指的就是利用特定的技术或工具在Windows系统上创建一个虚拟的无线网络接入点,允许其他设备通过WiFi连接到同一个网络。描述中提到的“局域网虚拟WiFi神器”可能是一款软件,它...

    使用Cisco Packet Tracer实现两个局域网通信

    使用Cisco Packet Tracer实现两个局域网通信,亲自测试可以使用

    局域网通讯软件的设计与实现

    局域网通讯软件是计算机网络技术中的一个重要应用,它使得在同一局域网内的设备能够实现高效、便捷的数据交互。本文将深入探讨局域网通讯软件的设计原理和实现方法,以及如何利用此类软件进行文件传输、聊天和广播...

    局域网 wifi android 聊天

    在IT领域,局域网(LAN)WiFi Android聊天应用程序是一个常见的项目,它允许在同一网络下的Android设备之间进行即时通信。这个应用通常利用Wi-Fi连接,而不是依赖于互联网,因此可以在没有移动数据的情况下进行本地...

    Android应用源码基于WIFI项目._局域网聊天

    在这个项目中,开发者利用了Android系统的APIs来实现手机搜索热点、创建热点以及通过socket进行数据传输,从而达到聊天的目的。下面将详细解析这些关键技术点。 首先,我们要理解WIFI热点的概念。WIFI热点是通过...

    Android WiFi Camera (无线局域网IP摄像头)

    Android WiFi Camera是一款基于Android平台的应用程序,它将用户的Android设备转变为一个无线局域网(WLAN)IP摄像头。这个应用程序允许用户通过WiFi网络在不同设备上实时查看、控制和记录来自Android设备的视频流,...

    基于android的wifi热点的局域网通讯仿飞鸽

    这个项目"基于android的wifi热点的局域网通讯仿飞鸽"就是这样一个示例,旨在模拟飞鸽传书的通信功能。下面将详细探讨涉及的知识点。 1. **Android WiFi热点**: Android系统提供了开启和管理WiFi热点的功能。通过`...

    android即时通讯APP程序.rar_android_即时通讯_局域网_局域网通讯APP

    这个"android即时通讯APP程序.rar"压缩包提供了实现局域网内两个客户端之间通讯的基础源码,主要包括两个核心文件:MainActivity.java和NetWorkUtils.java。 `MainActivity.java`通常是Android应用的主入口类,它...

    局域网聊天通讯工具

    飞秋(FeiQ)是一款免费的局域网即时通讯软件,它的主要特点是无需互联网连接,仅需在同一局域网内即可实现用户之间的实时通讯。飞秋支持文字聊天、文件传输、群组聊天、公告发布等功能,尤其适合于企业内部的日常...

Global site tag (gtag.js) - Google Analytics