现今,大家身边几乎都会有一台智能手机,安卓系统作为全球市场份额更大的移动操作系统,拥有着极高的可定制性和开发性,方便开发者和爱好者对其进行二次开发和定制。
对于一些需要进行网络连接的应用程序而言,建立TCP服务器是一个很普遍的需求。在这篇文章中,我们将会分享如何在安卓上搭建TCP服务器,同时将会介绍一些常用的第三方库及其使用方法。
一、Java自带的ServerSocket类
Java中的ServerSocket类可以方便地实现TCP服务器的搭建,安卓系统同样支持ServerSocket类的使用。
需要在安卓应用中新建一个线程,用以接收客户端请求。
“`java
public class ServerThread extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new MyThread(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
“`
上述代码中,我们创建了一个ServerThread线程,并在其中使用ServerSocket的accept()方法来接收客户端请求。当客户端请求到达时,将会启动一个新的线程来处理该请求,并在客户端断开连接之前一直保持该处理线程的运行状态。
在这个例子中,我们使用了MyThread类来处理客户端请求。
“`java
public class MyThread implements Runnable {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public MyThread(Socket socket) {
try {
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
String line = reader.readLine();
while (line != null) {
writer.println(line);
line = reader.readLine();
}
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
“`
在处理客户端请求时,我们需要使用Socket类与客户端建立连接。在这个例子中,我们使用BufferedReader类和PrintWriter类来分别读取客户端请求和响应请求。
二、使用第三方库
除了使用Java自带的ServerSocket类之外,还可以使用一些第三方库来方便地搭建TCP服务器。
1、Netty
Netty是一个高性能、异步的网络应用程序框架,可用于快速、稳定地开发高可用性的网络应用程序。
使用Netty搭建TCP服务器时,需要定义一个ChannelInitializer来初始化所有的ChannelHandler,并将其添加到ChannelPipeline中。以下代码展示了如何使用Netty搭建TCP服务器。
“`java
public class TCPServer {
public static void mn(String[] args) {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new MyServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(8888).sync();
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
“`
在上述代码中,我们使用了NioEventLoopGroup和ServerBootstrap类来创建一个TCP服务器。childHandler方法指定了我们需要使用的ChannelHandler,而ChannelInitializer类则可以方便地初始化所有的ChannelHandler。
下面是一个简单的ServerHandler示例代码:
“`java
public class MyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
try {
System.out.println(in.toString(io.netty.util.CharsetUtil.US_ASCII));
ctx.write(in);
ctx.flush();
} finally {
ReferenceCountUtil.release(msg);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
“`
在ServerHandler中,我们需要重写channelRead方法来处理客户端请求。当有数据从客户端传入时,该方法会被自动调用。在上述代码中,我们使用了ByteBuf类来读取客户端请求,并使用ChannelHandlerContext的write方法将响应写回客户端。
2、开源库MINA
MINA是一个基于NIO的网络应用程序框架,为Java网络编程提供了高度可扩展性和灵活性,允许开发者使用不同的协议轻松地搭建各种网络应用程序。
以下是一个使用MINA搭建TCP服务器的示例代码:
“`java
public class TcpServer {
private static final int PORT = 8888;
public static void mn(String[] args) throws IOException {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.setHandler(new MyIoHandler());
acceptor.getSessionConfig().setReadBufferSize(2023);
acceptor.bind(new InetSocketAddress(PORT));
}
}
“`
在上述代码中,我们创建了一个NioSocketAcceptor并在其中使用MyIoHandler类来处理客户端请求。getSessionConfig方法可以设置会话的更大读取字节数。我们使用bind方法将服务器绑定到一个指定的端口上。
MyIoHandler中实现了一个实现了IoHandler接口的类,并重写了当客户端连接上该服务器端口时、接收到客户端信息时和客户端连接关闭时应该执行的代码。以下是一个更加详细的示例代码:
“`java
public class MyIoHandler extends IoHandlerAdapter {
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = message.toString();
System.out.println(“服务器接收到的消息为:” + msg);
WriteFuture writeFuture = session.write(“服务器已接收到您的请求”);
writeFuture.addListener(new IoFutureListener() {
@Override
public void operationComplete(WriteFuture future) {
if (future.isWritten())
System.out.println(“服务器成功向客户端发送了响应”);
else
System.out.println(“服务器向客户端发送响应失败”);
}
});
}
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
}
}
“`
在上述代码中,我们使用IoSession类来表示服务器与客户端之间的会话。在messageReceived方法中,我们重写了接收到客户端信息时应该执行的代码,并在其中使用WriteFuture来发送响应信息。
三、
相关问题拓展阅读:
- tcpsocket-android 怎么把手机作为服务器接收显示数据
tcpsocket-android 怎么把手机作为服务器接收显示数据
【问题描述】:解决登录英雄联盟时一直提示服务器繁忙【解决方案】:1.校正您的系耐迟统时间(年月日以及时间)与真实时间一致。另外如果设置过固定IP地址的请设定回自动获取IP(如果一定要固定IP才能昌闷李上网的罩颂跳过)2..打开浏览器.点选菜单→Internet选项→高级标签。把红框内的选项保持在未勾选的状态图2:关于安卓 tcp 服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。