应用场景:
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.称: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();这个位置停住,一直无法继续进行
里面出问题了
你确定可以一直获得数据
setInput();
setInputReader();
setBufferedReader();
这些资源型的变量不应该每次初始化。
我是说你主机发什么东西,它称会回说明东西
2.可以用TCP/UDP测试工具看看收发情况
像这种和硬件结合的,个人认为应该分步测试
首先用你的软件和像TCP/UDP这样测试工具进行通讯
成功后在用TCP/UDP测试工具于你的称通讯,两方面,都没问题了再往一起对接
3.你的程序到那里不走了应该是阻塞了,也就是说它在那一直等着硬件那边返回数据
具体的阻塞再看一下I/O的api
LS所说的资源变量的初始话问题也要注意LZ再检查一下
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();位置停了。
是因为,服务器端没有联接上后面的联接,
服务端的ServerSoket 有个方法是在while
里有个accept
while{
Socket s=serversocket.accept();
}
垫在称的说明书上写着,按照TCP/IP网络编程就行,我是把电子称默认为网络的服务端,客户端和称建立好一个连接后,它就应该维护这个链接,按确定按钮时就应该向输出流里写入数据。可是就是不行。
用pc机给称发命令
称接受命令后返回数据不知道我是否理解lz的意思了
称是服务器,它使用固化在里面的 IP:192.168.1.101;port:3001
你需要做的是客户端,来接收数据它们之间通讯的过程是
称和pc用网线相连,称启动做服务器监听3001端口
pc启动程序连接到称等待接收数据
当你按称上的按钮时它会通过3001端口传数据给pc
是这样的吗!?那LZ可以先停掉pc程序,换用一个TCP/IP测试工具来建立一个客户端连称
可是不是每次按按钮都会返回数据
如果是
那肯定是LZ程序的问题了