做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 遇到的问题和解决方法
2.2 学习到了什么?
- 认识了什么是Socket,以及socket的基本实现
- 认识了socket中还有缓存需要注意的地方
- 了解了从控制台中读取输入的另外一种方法
3. 下面我们会干点什么?
- 上面的程序只能连接一次,服务就关闭了,应该改进一下
- 多个客户端连接到服务器端,怎么交互呢
分享到:
相关推荐
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-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-...
mina-filter-compression-2.0.7.jar,mina 过滤器jar包,核心包之一
本库是对我在项目中使用的Mina和长连接的一个封装,亲测有效,在网络良好的情况下,几乎能够保证100%的连接和通讯;
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-core-2.0.0-M1-sources.jar是构建mina框架的主要文件
mina-core-2.0.0-RC1-sources.jar
socket的tcp/udp(多播) nio的tcp/udp mina 均有服务端/客服端
mina-integration-ognl-2.0.0-M4.jar mina-integration-ognl-2.0.0-M4.jar
mina-integration-beans-2.0.0-M4.jar mina-integration-beans-2.0.0-M4.jar
根据HPSocketCS.TcpPackServer server = new HPSocketCS.TcpPackServer();的封包规则进行mina拆包,解决断包,粘包问题。亲测,30ms一次数据,无丢包现象,20MB,300人使用网络,
mina-core-2.0.0-M1.jar包和slf4j相关jar包
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学习者不可错过的学习资源,再次分享给大家!
mina-core-2.0.0-M6.jar
mina 最新 2.0 RC1 mina-core-2.0.0-RC1.jar mina-core-2.0.0-RC1-sources.jar
mina-filter-compression-2.0.2.jar
mina-core-2.0.0-RC1.jar
Mina是比较程序的Java socket框架,附件为mina框架源码