Android Socket客户端(Socket通信)

1、在服务器上启动Socket端口监听

  此处设置为0.0.0.0:37280,为监听到达服务器的所有ip


2、安卓客户端,连接服务器

  填写服务器的ip地址,进行连接


示例demo下载

示例源码下载


安卓Socket客户端核心源码:


package sci.tool;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.concurrent.Executors;


/** SocketClient.java: 对Socket进行简单接口封装,便于使用。
 * 
 * 用法:
 * client = new SocketClient(print, ipString, port);	// 创建客户端Socket操作对象
 * client.start();										// 连接服务器
 * client.Send(data);									// 发送信息
 * client.disconnect();									// 断开连接
 * 
 * ----- 2019-6-18 下午5:36:25 scimence */
public class SocketClient
{
	public String ipString = "127.0.0.1";   // 服务器端ip
	public int port = 37280;                // 服务器端口
	
	public Socket socket;
	public SocketCallBack call;				// 数据接收回调方法
	
	public SocketClient(SocketCallBack print, String ipString, int port)
	{
		this.call = print;
		if (ipString != null) this.ipString = ipString;
		if (port >= 0) this.port = port;
	}
	
	/** 创建Socket并连接 */
	public void start()
	{
		if (socket != null && socket.isConnected()) return;
			
		Executors.newCachedThreadPool().execute(new Runnable()
		{
			@Override
			public void run()
			{
				try
				{
					if (socket == null)
					{
						InetAddress ip = InetAddress.getByName(ipString);
						socket = new Socket(ip, port);
						
						if (call != null) call.Print("服务器已连接 -> " + ip + ":" + port);
					}
				}
				catch (Exception ex)
				{
					if (call != null) call.Print("连接服务器失败 " + ex.toString()); // 连接失败
				}
				
				// Socket接收数据
				try
				{
					if (socket != null)
					{
						InputStream inputStream = socket.getInputStream();
						
						// 1024 * 1024 * 3 = 3145728
						byte[] buffer = new byte[3145728];		// 3M缓存
						int len = -1;
						while (socket.isConnected() && (len = inputStream.read(buffer)) != -1)
						{
							String data = new String(buffer, 0, len);
							
							// 通过回调接口将获取到的数据推送出去
							if (call != null)
							{
								call.Print("接收信息 -> " + data);
							}
						}
						
					}
				}
				catch (Exception ex)
				{
					if (call != null) call.Print("接收socket信息失败" + ex.toString()); // 连接失败
					socket = null;
				}
			}
		});
		
	}
	
	/** 发送信息 */
	public void Send(String data)
	{
		try
		{
			if(socket != null && socket.isConnected())
			{
				byte[] bytes = data.getBytes();
				OutputStream outputStream = socket.getOutputStream();
				outputStream.write(bytes);
				
				if (call != null) call.Print("发送信息 -> " + data);
			}
			else
			{
				if (call != null) call.Print("未连接服务器!清先连接后,再发送。");
			}
		}
		catch (Exception ex)
		{
			if (call != null) call.Print("发送socket信息失败!");
		}
	}
	
	/** 断开Socket */
	public void disconnect()
	{
		try
		{
			if (socket != null && socket.isConnected())
			{
				socket.close();
				socket = null;
				
				if (call != null) call.Print("服务器已断开! ");
			}
		}
		catch (Exception ex)
		{
			if (call != null) call.Print("断开socket失败!");
		}
	}
}
package sci.tool;

/**  
 * SocketCallBack.java: Socket信息回调逻辑
 * -----
 * 2019-6-18 下午5:41:56
 * scimence 
 */
public abstract class SocketCallBack
{	
	public abstract void Print(String info);
}

Android Socket 演示demo:


package sci.demo.androidautofit;

import sci.tool.ActivityComponent;
import sci.tool.SocketCallBack;
import sci.tool.SocketClient;
import sci.tool.ThreadTool;
import sci.tool.ThreadTool.ThreadPram;
import android.os.Bundle;


/** Android Socket 演示demo主界面 */
public class MainActivity extends ActivityComponent
{
	
	SocketClient client = null;
	
	/** 设置界面显示 */
	@Override
	public void Init(Bundle savedInstanceState)
	{
		this.setContentView("activity_main");
	}
	
	/** 按钮点击响应逻辑 */
	@Override
	public void Click(String viewId)
	{
		if (viewId.equals("btn_connect"))
		{
			if (client == null)
			{
				SocketCallBack print = new SocketCallBack()
				{
					@Override
					public void Print(String info)
					{
						showMsg(info);
					}
				};
				
				String ipString = EditText("editIp").getText().toString();					// 服务器端ip地址如: 10.80.8.201
				int port = Integer.parseInt(EditText("editPort").getText().toString());		// 服务器端的监听端口如: 37280
				
				client = new SocketClient(print, ipString, port);	// 创建客户端Socket操作对象
			}
			
			if (client != null) client.start();						// 连接服务器
		}
		else if (viewId.equals("btn_close"))
		{
			client.disconnect();									// 断开连接
		}
		else if (viewId.equals("btn_send"))
		{
			String data = EditText("editMsg").getText().toString();
			client.Send(data);										// 发送信息
		}
	}
	
	/** 在信息显示区显示信息 */
	private void showMsg(final String msg)
	{
		ThreadTool.RunInMainThread(new ThreadPram()
		{
			@Override
			public void Function()
			{
				String content = TextView("textMSG").getText().toString();
				TextView("textMSG").setText(msg + "\r\n" + content);
				
				// ScrollView("msg_scroll").fullScroll(ScrollView.FOCUS_DOWN);
			}
		});
	}
}

服务器端源码参考:https://blog.csdn.net/scimence/article/details/52957829

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Android 上实现 Socket 客户端和服务端通信,可以通过 Java 的 Socket 编程实现。下面是一个简单的示例: 1. 服务端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端已连接:" + socket.getInetAddress()); Thread thread = new Thread(new ServerThread(socket)); thread.start(); } } } ``` 2. 服务端线程代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class ServerThread implements Runnable { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str; while ((str = reader.readLine()) != null) { System.out.println("客户端发送消息:" + str); } } catch (IOException e) { e.printStackTrace(); } } } ``` 3. 客户端代码: ```java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("localhost", 8888); OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello Server".getBytes()); outputStream.flush(); socket.shutdownOutput(); socket.close(); } } ``` 在服务端启动后,等待客户端连接,当客户端连接后,开启一个线程处理客户端的请求。客户端通过 Socket 连接到服务端,发送消息后关闭连接。 注意:以上代码仅为示例,没有进行异常处理等操作,实际使用时需要根据具体需求补充完整。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值