当初接下这个任务的时候,并不曾想会搞的这么复杂。
业务需求很简单,用socket发一堆数据到服务器上,读取返回信息。
第一次用socket,新手能犯的错误都被完美的演绎了。
很快写完一个测试程序,但是发现读不到服务器返回的数据。于是开始热身第一战,socket的数据读取。
通过调试发现,程序卡在下面一行不动了
while((buf=br.readLine())!= null)
readLine是个阻塞的方法,如果没有数据会一直等待。再仔细的排查,数据是已经提交到过去了的,服务器用telnet测试是会有数据返回的。但是怎么读不到呢?
睡了一个晚上后,灵光一闪,readLine()是读一行,要是服务器没有发送换行符,是不是就一直等待了?
修改读数据代码如下:
byte[] b = new byte[10];
StringBuffer str = new StringBuffer("");
while (stream.read(b) > -1) {
str.append(new String(b));
}
万幸,能读到数据了。但是但是~~我不知道一个数据包什么时候结束--!而且程序也不能一直这么阻塞在这里,我需要结构良好反应快速的应用,而不是这么一个发一条hello信息的测试程序。
于是乎,SocketChannel闪亮登场。本来想用apache mina(希望没拼错),可是发现实在太难用了。虽然SocketChannel也很难用,至少一个测试程序还能一个屏幕显示的下。。。
改成SocketChannel后,惊讶、郁闷的发现,消息发不出去了~~
发消息的代码如下:注意这个是错误代码,跑不起来的
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello";
buf.put(s.getBytes());
channel.write(buf);
这个回合打的非常辛苦,一个下午加一个晚上的时间,不停的baidu,google,调程序,测程序,。。。。此处省略1000字。。。
一直到凌晨2点,都快哭了~~
女孩子熬夜老的快,一边担心脸上长皱纹,一边担心程序调不通。就在快要崩溃的时候,程序正常跑完了。
都忘了是怎么调通的了,精神恍惚,记忆错乱,当时以为是因为发送的消息没带换行符,后来才知道好像是另外个原因,至于那时候加的换行符,却引发了另外一个莫名其妙的问题,而我却陷在自己的思维怪圈中。
上述代码修改如下:
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
String s="hello\n";
buf.put(s.getBytes());
buf.flip();
channel.write(buf);
不管怎么样,我总算是得到一个能正常工作的程序,功能是用SocketChannel向服务器发送一个消息,然后把返回的数据显示出来。
未完待续
分享到:
相关推荐
1. **Server**: SuperSocket的核心组件,用于监听和接受客户端连接。它可以是基于TCP或UDP的,并且支持多线程、异步操作。 2. **Session**: 代表一个客户端的连接,每个客户端连接都会创建一个对应的Session对象。...
1. 创建Socket对象:`Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);` 2. 连接服务器:`socket.Connect(new IPEndPoint(IPAddress.Parse("服务器IP"), 端口号));` ...
1. **连接与监听**:SocketTool允许用户设置服务器端的监听套接字,用于接收客户端的连接请求。同时,它也支持作为客户端,连接到远程服务器进行数据交互。 2. **数据传输**:该工具提供发送和接收数据的功能,可以...
1. **SuperSocket.Mono.sln**、SuperSocket.2010.NET35.sln等.sln文件:这些都是Visual Studio的解决方案文件,用于管理和构建SuperSocket项目。 2. **LICENSE.TXT**和**README.TXT**:分别包含了软件的许可证信息...
Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...
Socket 有两种类型:基于流的 Socket(Stream Socket)和基于数据报的 Socket(Datagram Socket)。 * 基于流的 Socket:使用 TCP 协议,提供可靠的、有序的、无损失的数据传输。例如,HTTP、FTP、TELNET 等协议都...
这个组件包括了静态库HPSocket.lib和动态库HPSocket_D.lib,以及一系列必要的头文件,使得开发者可以在自己的项目中方便地集成和使用HPSocket的功能。 HPSocket库的核心功能在于其对TCP/IP协议的支持,包括TCP...
1. 创建Socket:客户端创建Socket对象,并指定服务器的IP地址和端口号。 2. 建立连接:调用Socket对象的connect()方法,尝试与服务器建立连接。 3. 数据交换:连接成功后,客户端可以通过Socket对象向服务器发送数据...
通过以上介绍,我们可以看出SuperSocket是一个强大且灵活的Socket开发框架,它不仅降低了TCP和UDP应用的开发难度,还提高了程序的稳定性和性能。无论是新手还是经验丰富的开发者,都可以利用SuperSocket快速构建高效...
接着,定义RawSocket类,包括error_occurred、KeepRunning、len_receive_buf、receive_buf_bytes和socket等参数。最后,实现构造函数,初始化变量参数。 C#raw Socket编程的应用场景: 1. 网络封包监视 2. 网络...
SocketTool是一款功能强大的TCP/UDP Socket调试工具,版本为V2.2,它为开发者提供了便利的网络通信测试环境。...在实际使用中,只需运行压缩包内的"SocketTool.exe"文件,即可启动工具并开始你的Socket调试之旅。
本示例涉及的主题是“socket服务和客户端测试XML文件接收和发送”,这是一个使用C#语言实现的项目,它允许通过Socket进行XML数据的交换。让我们深入探讨这个主题,了解其背后的原理和实现方法。 首先,Socket是TCP/...
这款工具的强大之处在于它不仅提供了基础的端口监听功能,还支持Socket的二次开发,为程序员和网络管理员提供了更广阔的定制空间。 在TCP协议中,SocketTool能够帮助用户建立可靠的、面向连接的通信链路。TCP协议...
在IT行业中,网络编程是构建分布式系统和互联网应用程序的基础,而Socket编程是网络通信的核心。本文将深入探讨“跨平台的socket库,windows-linux-socket”这一主题,旨在帮助开发者理解如何在Windows和Linux操作...
1. **服务器端设置**:在Node.js项目中,导入`socket.io`模块,初始化服务器并监听特定端口,然后使用`io.on('connection', (socket) => {})`来处理新连接和事件。 2. **客户端连接**:在Java或Android应用中,导入...
Socket测试工具是网络编程中非常重要的辅助软件,主要用于检测和调试基于Socket协议的网络通信问题。Socket,也称为套接字,是应用层与传输层之间的接口,它允许应用程序通过TCP/IP协议进行数据交换。在开发网络应用...
SocketTool(很好用的socket测试工具)
Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short Connection)** 短连接通常用于一次性、非持久性的通信,如HTTP协议就是典型的短连接。在短连接中...