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();
				}
			}
		}
	}
}
客户端的实现就比较简单,客户端代码实现连接服务端功能以及发送消息数据等功能即可,此处不再贴出。

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用socket可以实现一个基于c/s架构通信程序。在该程序客户端和服务器之间通过socket进行通信客户端通过socket连接服务器,向服务器发送请求,服务器接收请求并处理,然后将处理结果返回给客户端客户端接收到服务器返回的结果后,进行相应的处理。通过socket实现通信程序可以实现不同计算机之间的通信,具有广泛的应用场景。 ### 回答2: Socket是用于在网络之间进行通信的API。使用Socket可以使不同的计算机之间的应用程序相互通信。C/S架构通信程序又叫客户端/服务器通信程序,简单来说,客户端发送请求给服务器,服务器接受并处理请求,之后将结果返回给客户端客户端收到回应结果。 首先,我们需要明确通信的两客户端和服务器。在服务,我们需要创建一个Socket对象,用于指定一个口并等待客户端连接。在客户端,我们需要创建一个Socket对象,指定连接的口和IP地址。 在服务,首先需要创建一个Socket对象,并且绑定到一个本地地址和口上。接着,需要监听这个口,以等待客户端的连接。一旦有客户端连接,服务器会为每一个连接创建一个新的线程,用于处理客户端的请求。 在客户端,需要创建一个Socket对象并连接到服务器的IP地址和口。一旦连接成功,客户端就可以发送请求到服务器。并等待服务器的回复。 在通信的过程,我们可以使用IO流或者NIO来传输数据。收到客户端的请求后,服务器会将请求信息解析并处理,最后将结果返回给客户端Socket通信程序的设计需要考虑到请求和回应的格式和内容。通信的安全性和稳定性也需要考虑在内。程序的并发和负载能力也需要专门优化,以提供更好的服务。唯有这样,Socket通信程序才能够顺利运行,使得客户端与服务之间的数据连续可以得到传输、处理和应答。 ### 回答3: socket 是一种通信协议,它提供了一种基于网络的通讯方式,因此我们可以借助它来实现一个基于 c/s 架构通信程序。在这个程序,服务器客户端将成为两个独立的部分,它们之间通过 socket 进行通讯。 首先,我们需要在服务器创建一个 socket,以便它能够监听客户端的连接请求。通过调用函数 socket() 来创建一个 socket,然后再调用 bind() 函数来将其绑定到一个本地的口上。在这个过程,我们需要指定一个口号,以便客户端知道在哪个口上进行连接请求。然后,我们再调用 listen() 函数来开始监听客户端的连接请求。 一旦客户端与服务器建立了连接,我们就可以进行通讯了。服务器可以使用 accept() 函数来接受新连接,然后通过 send() 函数向客户端传输数据。客户端可以使用 connect() 函数来连接服务器,并通过 recv() 函数读取来自服务器的数据。在通讯过程,服务器和客户端都需要指定传输的协议类型,例如 TCP 或 UDP。 在实现过程,需要注意以下几点: 1. 在服务器同时连接多个客户端时,需要为每个连接创建一个新的线程,以避免因为一个客户端发生阻塞而导致其他客户端无法连接。 2. 在传输数据时,需要注意数据的格式,例如使用 ASCII 码或二进制编码。 3. 需要处理异常情况,例如断开连接或无法建立连接的情况。 总体来说,使用 socket 实现基于 c/s 架构通信程序需要对网络编程和 socket 协议有一定的了解。如果在实现过程遇到问题,可以参考相关技术文档或寻求专家的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值