应用场景:
1.称:kingbird plus 以太网台秤。说明书上写明具有自己固定的IP地址,通讯采用TCP/IP协议,通过标准以太网RJ-45接口与网络相连。IP:192.168.1.101;port:3001
2.客户端:PC机
客户端代码如下:
class httpPortDeal implements Runnable {
Socket socket; BufferedReader bReader; InputStreamReader inputReader; InputStream input; public httpPortDeal() {
try {
socket = new Socket("192.168.1.101", 3001);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
 * 
 * @param netAdd--IP
 *            地址
 * @param port--端口号
 * @throws UnknownHostException
 * @throws IOException
 */
public httpPortDeal(String netAdd, int port)
throws UnknownHostException, IOException {
socket = new Socket(netAdd, port);
System.out.println("成功连接!");
} public void run() {
try {
// 初始化
// setInput();
// setInputReader();
// setBufferedReader();
String data;
BigDecimal bdQty = new BigDecimal(String.valueOf(0.00));
while (true) {
setInput();
setInputReader();
setBufferedReader();
System.out.println(inputReader.ready());
System.out.println(bReader.ready());
data = bReader.readLine();
System.out.println(inputReader.read());
System.out.println(data);
if (null != data && !"".equals("")) {
bdQty = PeiSongUtil.getNullValue(data);
setRowValue(bdQty);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} private void setRowValue(BigDecimal bdQty) {
if (rowIndex != -1) {
// kdtEntrys.getRow(rowIndex).getCell("").setValue(bdQty);
txtconfirmWeight.setValue(bdQty);
txtcheckWeight.setValue(bdQty);
} else {
System.out.println("请选中行后按确认");
}
} public void close() {
try {
this.socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
通过 new Thread(new httpPortDeal()).start();// 开始读取网络数据
结果:只能第一次和称建立连接时读取到数据。之后无法获得数据。
3.现象:只能第一次和称建立连接时读取到数据。之后无法获得数据。在data = bReader.readLine();这个位置停住,一直无法继续进行

解决方案 »

  1.   

    估计是while (true) {
    里面出问题了
    你确定可以一直获得数据 
      

  2.   

    代码理缺的东西太多,inputReader是什么?还有为什么在while循环里每次
    setInput(); 
    setInputReader(); 
    setBufferedReader(); 
    这些资源型的变量不应该每次初始化。
      

  3.   

    1.它们之间应该有通讯协议吧
    我是说你主机发什么东西,它称会回说明东西
    2.可以用TCP/UDP测试工具看看收发情况
    像这种和硬件结合的,个人认为应该分步测试
    首先用你的软件和像TCP/UDP这样测试工具进行通讯
    成功后在用TCP/UDP测试工具于你的称通讯,两方面,都没问题了再往一起对接
    3.你的程序到那里不走了应该是阻塞了,也就是说它在那一直等着硬件那边返回数据
    具体的阻塞再看一下I/O的api
    LS所说的资源变量的初始话问题也要注意LZ再检查一下
      

  4.   

    代码理缺的东西太多,inputReader是什么? 还有为什么在while循环里每次 
    setInput(); 
    setInputReader(); 
    setBufferedReader(); 
    这些东西确实是不应该写在循环里,一开始确实没这么写,可是他只能读取一次数据,再往后就在data = bReader.readLine(); 这个位置停了,后来将while循环改成
    while (true) {
    socket = new Socket("192.168.1.101", 3001);
    setInput();
    setInputReader();
    setBufferedReader();
    System.out.println("是否连接成功:"+!socket.isClosed()+inputReader.ready()+bReader.ready());
    data = bReader.readLine();
    System.out.println(data);
    if (null != data && !"".equals("")) {
    bdQty = PeiSongUtil.getNullValue(data);
    setRowValue(bdQty);
    }
    socket.close();
    }
    连接几次成功后,就又在data = bReader.readLine();位置停了。
      

  5.   

    第一次联接成功,后面联接不成功,
    是因为,服务器端没有联接上后面的联接,
    服务端的ServerSoket 有个方法是在while
    里有个accept
    while{
      Socket s=serversocket.accept();
    }
      

  6.   


    垫在称的说明书上写着,按照TCP/IP网络编程就行,我是把电子称默认为网络的服务端,客户端和称建立好一个连接后,它就应该维护这个链接,按确定按钮时就应该向输出流里写入数据。可是就是不行。
      

  7.   

    我们公司用的电子称是串口通讯的
    用pc机给称发命令
    称接受命令后返回数据不知道我是否理解lz的意思了
    称是服务器,它使用固化在里面的 IP:192.168.1.101;port:3001 
    你需要做的是客户端,来接收数据它们之间通讯的过程是
    称和pc用网线相连,称启动做服务器监听3001端口
    pc启动程序连接到称等待接收数据
    当你按称上的按钮时它会通过3001端口传数据给pc
    是这样的吗!?那LZ可以先停掉pc程序,换用一个TCP/IP测试工具来建立一个客户端连称
    可是不是每次按按钮都会返回数据
    如果是
    那肯定是LZ程序的问题了