`
游伯度
  • 浏览: 22768 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习Mina2(知识准备 - socket - 1)

阅读更多
做Java编程这么多年了,今天学习mina框架的时候,确发现自己连socket编程都不太了解,真是愧对这几年的Java学习经验了。所以在学习mina2前,我首选尝试者了解一下socket。

1. 先摸索个例子程序

实现功能概述:客户端向服务端发送一个命令,服务端接受,并发消息给客户端证明已经收到。如果输入“end”(不区分大小写)测试结束。

1.1 socket服务端
public class CmdServer {
	public static final Log LOG = LogFactory.getLog(CmdServer.class);

	public static final int SERVER_PROT = 8100;
	private static final CmdServer cmdServer = new CmdServer();

	private ServerSocket server;

	private CmdServer() {
		try {
			server = new ServerSocket(SERVER_PROT);
		}
		catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e.getCause());
		}
	}

	public static CmdServer getServer() {
		return cmdServer;
	}

	public void receiveCmd() {
		LOG.info(">>>接受命令开始...");
		BufferedReader reader = null;
		PrintWriter writer = null;
		try {
			Socket client = server.accept();
			reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
			writer = new PrintWriter(client.getOutputStream());
			while (true) {
				String cmd = reader.readLine();
				writer.print("roger : " + cmd + "\n");
				LOG.info("roger : " + cmd);
				writer.flush();
				if (StringUtils.endsWithIgnoreCase("end", cmd)) {
					break;
				}
			}
			client.close();
		}
		catch (IOException e) {
			LOG.error(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e.getCause());
		}
		finally {
			IOUtils.closeQuietly(reader);
			IOUtils.closeQuietly(writer);
		}
		LOG.info("<<<接受命令结束");
	}
}

public class RunSocketServer {

	public static void main(String[] args) {
		CmdServer server = CmdServer.getServer();
		server.receiveCmd();
	}

}

1.2 socket客户端
public class CmdClient {
	public static final Log LOG = LogFactory.getLog(CmdClient.class);

	private Socket server;
	
	public CmdClient() {
		try {
			server = new Socket(InetAddress.getLocalHost(), CmdServer.SERVER_PROT);
		}
		catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e.getCause());
		}
	}

	public void writeCmd() {
		LOG.info(">>>写命令开始...");
		Scanner scanner = new Scanner(System.in);
		BufferedReader reader = null;
		BufferedWriter writer = null;
		try {
			reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
			writer = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
			while (true) {
				String cmd = scanner.nextLine();
				LOG.info("input:" + cmd);
				writer.write(cmd + "\n");
				writer.flush();
				if (StringUtils.endsWithIgnoreCase("end", cmd)) {
					break;
				}
				LOG.info(reader.readLine());
			}
			server.close();
		}
		catch (Exception e) {
			LOG.error(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e.getCause());
		}
		finally {
			scanner.close();
			IOUtils.closeQuietly(reader);
			IOUtils.closeQuietly(writer);
		}
		LOG.info(">>>写命令结束");
	}
}

public class RunSocketClient {

	public static void main(String[] args) {
		CmdClient client = new CmdClient();
		client.writeCmd();
	}
}


2 总结
这么简单的一个程序,需要多久才能够调通呢?对我这样的菜鸟来说折腾了很久。

2.1 遇到的问题和解决方法
  • 感觉只能从客户端写一行字符串,然后程序就戛然而止
  • 首选我怀疑是用控制台输入的问题,开始使用的是System.in来包装BufferedReader,所以就查了一些资料,发现可以在JDK5下面可以使用Scanner scanner = new Scanner(System.in);(参考http://www.mkyong.com/java/how-to-read-input-from-console-java/)。使用原始的bufferReader时无法循环的读取输入。
  • 终于可以多行了,但是服务器端不是实时接收到的,只有调用close的时候才收到
  • 发现当客户端程序运行到LOG.info(reader.readLine());时,就运行不下去了。
    于是注释这句试试,发现可以运行,但是服务器端貌似不是实时的输出,开始怀疑是socket缓存的问题(参考http://blog.sina.com.cn/s/blog_616e189f0100s3px.html)。但是无论我怎么调整服务器端和客户端的缓存的大小,都是无法解决。
    最后发现是程序是读取一行的,但是我写入数据的时候没有分行符"\n"导致的。加上分行符,问题解决了

2.2 学习到了什么?
  • 认识了什么是Socket,以及socket的基本实现
  • 认识了socket中还有缓存需要注意的地方
  • 了解了从控制台中读取输入的另外一种方法

3. 下面我们会干点什么?
  • 上面的程序只能连接一次,服务就关闭了,应该改进一下
  • 多个客户端连接到服务器端,怎么交互呢
分享到:
评论

相关推荐

    mina2.0 含11个jar包

    mina-core-2.0.0-M6.jar mina-example-2.0.0-M6.jar mina-filter-codec-netty-2.0.0-M6.jar mina-filter-compression-2.0.0-M6.jar mina-integration-beans-2.0.0-M6.jar mina-integration-jmx-2.0.0-M6.jar mina-...

    Android-MinaSocket一款基于Mina的Socket长连接库

    **Android-MinaSocket:基于Mina的高效Socket长连接库** 在移动应用开发中,尤其是Android平台,实时性与稳定性是许多应用场景的核心需求,比如在线游戏、即时通讯、物联网设备等。在这种背景下,使用Socket进行长...

    mina-core-2.0.0-RC1.jar,mina-filter-compression-2.0.0-RC1.jar

    在这个场景中,我们关注的是MINA的核心组件以及两个特定的过滤器和传输组件:`mina-core-2.0.0-RC1.jar`、`mina-filter-compression-2.0.0-RC1.jar`和`mina-transport-apr-2.0.0-RC1.jar`。 **MINA Core (mina-core...

    网络编程(socket、NIO、mina)---demo

    在这个"网络编程(socket、NIO、mina)---demo"的主题中,我们将深入探讨三个关键概念:Socket编程、非阻塞I/O(Non-blocking I/O,简称NIO)以及Apache Mina框架。这些技术广泛应用于构建高性能、高并发的网络应用...

    mina-filter-compression-2.0.7.jar

    mina-filter-compression-2.0.7.jar,mina 过滤器jar包,核心包之一

    HPsocket 封包与mina对接

    ### HPsocket 封包与mina对接 #### 一、HPsocket概述 HPsocket是一个高性能、跨平台的TCP/UDP/串口通信中间件库,它提供了丰富的API接口和灵活的事件驱动模型,使得用户可以方便地开发自己的网络应用程序。本文将...

    mina-core-2.0.0-M1.jar/mina-example-1.0.5.jar

    mina-core-2.0.0-M1.jar/mina-example-1.0.5.jar/slf4j-jdk14-1.6.1.jar/slf4j-log4j12-1.6.1.jar mina 所用jar

    mina学习资料--很实用

    Apache Mina是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。它主要关注网络通信的I/O层...通过深入学习和实践这些知识,你将能够利用Mina框架构建出高效、稳定的网络服务,应对高并发场景下的通信挑战。

    mina-core-2.0.0-M1-sources.jar

    mina-core-2.0.0-M1-sources.jar是构建mina框架的主要文件

    mina-core-2.0.0-RC1-sources.jar

    mina-core-2.0.0-RC1-sources.jar

    Mina+Socket通信

    Mina和Socket是两种常见的网络通信框架和技术,它们在Java编程环境中被广泛使用。本篇文章将深入探讨如何使用Mina与Socket实现通信,并提供客户端和服务端的实现代码概述。 Mina(全称“MINA: Minimalistic ...

    mina-integration-ognl-2.0.0-M4.jar

    mina-integration-ognl-2.0.0-M4.jar mina-integration-ognl-2.0.0-M4.jar

    mina-core-2.0.0-M1.jar和slf4j

    《mina-core-2.0.0-M1.jar与SLF4J:构建高效网络通信与日志记录》 mina-core-2.0.0-M1.jar是Apache Mina项目的核心库,它是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端和客户端应用程序。...

    mina2.0全部jar包

    mina-transport-apr-2.0.7.jar是MINA对Apache Portable Runtime (APR)的支持,APR是一个库,提供了操作系统级别的接口,如socket和线程,可以提升MINA在某些平台上的性能。 mina-integration-jmx-2.0.7.jar提供了...

    mina-integration-beans-2.0.0-M4.jar

    mina-integration-beans-2.0.0-M4.jar mina-integration-beans-2.0.0-M4.jar

    MINA-2.0.0-M3

    综上所述,MINA-2.0.0-M3源码的学习将涵盖Java网络编程、非阻塞I/O、事件驱动编程、协议处理等多方面知识,对于想要深入了解网络应用开发和优化的Java开发者来说,是一份宝贵的资料。通过研究MINA的源代码,不仅可以...

    mina-core-2.0.0-RC1

    2. **mina-core-2.0.0-RC1-sources.jar**:这个文件包含了mina-core的源代码,对于开发者来说,它是理解和定制MINA行为的关键资源。通过阅读源码,开发者可以更深入地了解MINA的工作原理,调试问题,甚至为MINA贡献...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    标题中的"Apache-Mina-2.rar"和"mina-mina-core-1.1.3"表明这是关于Apache Mina 2.x版本,特别是其核心模块的1.1.3版本。 Apache Mina的名称来源于"Multi-purpose Infrastructure for Network Applications",它...

    mina-transport-rawsocket

    Apache Mina 传输原始套接字Apache mina Rawsocket 传输使用本机库 jnetpcap 1.4.r1425 来自: ://jnetpcap.com/download 请参阅: : 用于 NIC(网络接口卡)的 IoAcceptor //10.10.10.1 is one of nic's ip ...

    mina-transport-apr-2.0.2.jar

    mina-transport-apr-2.0.2.jar

Global site tag (gtag.js) - Google Analytics