nio 接收信息的时候说java.io.IOException: 您的主机中的软件放弃了一个已建立的连接

a13092319718 2010-08-21 10:43:54
下面是我的代码,请大虾们帮忙给看看啊,在线等:


package com.ofcard.mobile.channel;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

public class ChannelClient {
private SocketChannel socketChannel;
private static String HOST;
private static int PORT ;
private Selector selector = null;
// private InputStream in;
// private OutputStream out;

public static String busType;// 业务类型
public static String loginMessageHead; // 登陆报文头
public static String loginMessageCode;// 登陆报文消息码
public static String carrierCode;// 运营商代码
public static String corporateCode;// 企业代码
public static String version;// 协议版本号
public static String psd;
public static String logoutMessageCode;// 登出消息码
public static String transPsd;// 企业交易密码

static {
Properties prop = new Properties();
InputStream in = Object.class.getResourceAsStream("/config.properties");
try {
prop.load(in);
HOST = prop.getProperty("SOCKETIP").trim();
PORT = Integer
.parseInt(prop.getProperty("SOCKETPROT").trim());
busType = prop.getProperty("BUSTYPE").trim();
loginMessageHead = prop.getProperty("LOGINMESSAGEHEAD").trim();
loginMessageCode = prop.getProperty("LOGINMESSAGECODE").trim();
carrierCode = prop.getProperty("CARRIERCODE").trim();
corporateCode = prop.getProperty("CORPORATECODE").trim();
version = prop.getProperty("VERSION").trim();
psd = prop.getProperty("PSD").trim();
logoutMessageCode = prop.getProperty("LOGOUTMESSAGECODE").trim();
transPsd = prop.getProperty("TRANSPSD").trim();
} catch (IOException e) {
e.printStackTrace();
}
}


public ChannelClient() throws IOException {
// TODO Auto-generated constructor stub
initialize();//初始化
comhandNet();
}
private void comhandNet() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
String send = "心跳访问";
try {
sendData(send.getBytes("UTF-16"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 0, 10000);
}

//初始化客户端连接
private void initialize() throws IOException {
// TODO Auto-generated method stub
//打开监听通道
socketChannel = SocketChannel.open(new InetSocketAddress(HOST,PORT));
//设置非阻塞模式
socketChannel.configureBlocking(false);

//打开选择器并注册到信道
selector = Selector.open();
socketChannel.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE);//读取集
//启动读取的线程----
new ChannelReadClient(selector);
}
/**
* 发送数据到服务器
* @param byout
* @throws IOException
*/
public void sendData(byte[] byout) throws IOException{
ByteBuffer writeBuf = ByteBuffer.wrap(byout);
socketChannel.write(writeBuf);
// out = socketChannel.socket().getOutputStream();
// out.write(byout);
}
public static void main(String[] args) throws IOException {
ChannelClient c = new ChannelClient();
MobileRecharge n = new MobileRecharge();
String send = n.doLogin();
c.sendData(send.getBytes("UTF-16"));
}
}




package com.ofcard.mobile.channel;

import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;

public class ChannelReadClient extends Thread {

private Selector selector;

public ChannelReadClient(Selector selector) {
this.selector = selector;
new Thread(this).start();
}

public void run() {
// TODO Auto-generated method stub
try{
while(selector.select()>0){//有事件发生时
Iterator it = selector.selectedKeys().iterator();//对可用通道操作对应的selectedKey迭代
while(it.hasNext()){
SelectionKey skey = (SelectionKey) it.next();
if(skey.isValid()&&skey.isReadable()){//如果有效且可读
//读取channel中数据
SocketChannel channel = (SocketChannel) skey.channel();
ByteBuffer bf = ByteBuffer.allocate(4000000);
channel.read(bf);
bf.flip();
// 将字节转化为为UTF-16的字符串
String receivedString=Charset.forName("UTF-16").newDecoder().decode(bf).toString();
// 控制台打印出来
System.out.println("接收到来自服务器"+channel.socket().getRemoteSocketAddress()+"的信息:"+receivedString);
//为下次读取准备
skey.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}
it.remove();//删除已经处理的SelectionKey
}
}
}catch(Exception e){
e.printStackTrace();
}
}

}
...全文
946 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a13092319718 2010-08-21
  • 打赏
  • 举报
回复
大家帮忙给看看啊
a13092319718 2010-08-21
  • 打赏
  • 举报
回复
唉, 您的主机中的软件放弃了一个已建立的连接 是心跳数据包有问题,但是我改了之后有出现了:

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:33)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
at sun.nio.ch.IOUtil.write(IOUtil.java:75)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:300)
at com.ofcard.mobile.channel.ChannelClient.sendData(ChannelClient.java:105)
at com.ofcard.mobile.channel.ChannelClient$1.run(ChannelClient.java:74)
at java.util.TimerThread.mainLoop(Timer.java:432)
at java.util.TimerThread.run(Timer.java:382)


求大虾指点
内容概要:本文研究油浸式变压器在不同气候条件下的能量极限问题,通过Matlab代码实现建模与仿真,深入分析环境温度、湿度等气候因素对变压器热稳定性、负载能力及运行安全性的影响,进而确定其在多种工况下的最大能量承载极限。研究采用多智能体方法提升模型的适应性与仿真精度,综合考虑热平衡方程与环境参数输入,旨在为变压器的设计优化、容量规划、动态负载管理及智能电网的可靠性分析提供科学依据和技术支撑。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电气工程、能源系统仿真、电力设备设计等相关领域的科研人员与工程师,特别适合研究生及工作1-5年的专业技术人才; 使用场景及目标:①评估油浸式变压器在极端气候环境下的安全运行边界;②优化变压器的负载调度与能效管理策略;③支持智能电网背景下设备级动态容量规划与韧性电网建设;④为高可靠性供电系统的设计与运维提供理论参考; 阅读建议:学习者应结合提供的Matlab代码深入理解建模流程,重点掌握热传导模型构建、环境变量设定、多智能体协同机制及仿真参数调优方法,并通过调整气候条件进行多场景仿真实验,以深化对变压器能量极限形成机理的认知。
内容概要:本文系统研究了基于开关电容器的级联多电平逆变器在布尔PWM控制技术下的工作特性与仿真实现,深入分析该拓扑结构的工作原理、电容电压自平衡能力及其对输出波形质量的优化作用。通过Simulink平台构建完整的系统仿真模型,验证布尔PWM控制策略在抑制谐波畸变、提升直流电压利用率和改善输出电压精度方面的有效性,进一步探讨其在高效率、高电能质量要求的电力电子变换系统的应用潜力,为新型多电平逆变器的设计与控制提供理论依据与技术支撑。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的高校本科生、研究生,从事新能源发电、电机驱动及电力系统仿真的科研人员,以及具备MATLAB/Simulink基础并希望深入理解先进PWM控制技术的工程技术人员。; 使用场景及目标:①掌握开关电容器型级联多电平逆变器的结构优势与运行机理;②理解布尔PWM控制的基本原理及其在多电平调制的独特优势;③通过Simulink仿真实践,掌握控制模型搭建、参数整定与仿真结果分析方法;④为开展高性能逆变器相关课题研究或实际工程项目提供可复现的技术参考与设计思路。; 阅读建议:建议读者结合Simulink模型进行同步操作,重点关注布尔逻辑调制信号的生成方式、开关器件的驱动时序设计及电容电压动态响应特性,对比传统载波PWM等调制方法的性能差异,深入理解控制策略对系统稳态与动态性能的影响。同时可进一步拓展学习空间矢量PWM(SVPWM)、最近电平逼近(NLC)等其他先进调制技术,以全面掌握多电平逆变器的控制体系。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧