作者liataian (T-PANY FOREVER)
看板java
标题[问题] 简单的UDP程式一直报错
时间Mon Feb 2 19:21:56 2015
大家好,是这样的,我想写一个简单的UDP client/server程式,参考过网上很多范例,不过一直卡在某个环节让我无法进行下去,以下是程式:
Client端:每秒会送出一个时间封包给Server端,总共送十个封包
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException{
SocketAddress addr = new InetSocketAddress("192.168.1.100", 8888);
for(int i=0; i<=10; i++){
Long client_time = System.currentTimeMillis();
byte[] bdata = client_time.toString().getBytes();
DatagramPacket pack = new DatagramPacket(bdata, bdata.length, addr);
DatagramSocket dest = new DatagramSocket();
dest.send(pack);
try{
Thread.sleep(1000);
}catch(Exception e){
System.out.println(e);
}
}
}
}
Server端:接收Client端的时间封包,并将「Server端这边收到封包当下的时间」与「封包内Client端那边的时间」相减
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException{
byte[] buffer = new byte[50];
DatagramPacket pack = new DatagramPacket(buffer, buffer.length);
DatagramSocket dest = new DatagramSocket(8888);
while(true){
System.out.println("等待封包传进"+dest.getLocalPort());
dest.receive(pack);
long server_time = System.currentTimeMillis();
String data = new String(pack.getData());
try{
long client_time = Long.valueOf(data); //错误的地方
//System.out.println(client_time);
long difference = server_time - client_time;
System.out.println(difference);
} catch(NumberFormatException e){
System.out.println(e);
}
}
}
}
错误在这一行:long client_time = Long.valueOf(data);
每当要执行这一行时就会遇到「NumberFormatException」这个例外。
我查过原因大概是,将字串转成长整数时,字串内有包含「非数字」才会导致出错,可是我将client_time印出来的确都是数字,实在看不出哪里有错...卡这边卡了一个下午...
另外Long.parseLong()这方法也试过了还是不行
我的环境是Mac OSX,Client跟Server的程式都只在同一台机子上跑而已,有请版友帮忙提点一下,感谢...
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.118.155.43
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1422876120.A.112.html
※ 编辑: liataian (140.118.155.43), 02/02/2015 19:27:00
※ 编辑: liataian (140.118.155.43), 02/02/2015 19:31:12
1F:→ ssccg: 你该检查的是data里面是什麽 02/02 19:35
2F:→ sbrhsieh: new String(pack.get Data(),0,pack.getLength()) 02/02 19:35
3F:→ ssccg: data是整个buffer,不是只有你传的那个数字长度 02/02 19:36
4F:→ liataian: ssccg大,我试过印出data,就是一个从epoch至今的时戳, 02/02 19:37
5F:→ liataian: sorry更正, 如果data是整个buffer,那就是buffer内有问 02/02 19:38
6F:→ liataian: 题是吗@@? 02/02 19:38
7F:→ sbrhsieh: 再者,DatagramPacket要重复使用,每次都要透过 setData 02/02 19:39
8F:→ sbrhsieh: 去重新设定 buffer。 02/02 19:40
9F:→ liataian: sbrhsieh大,用你的方法好像成功了@@ 加了後面那串是做 02/02 19:42
10F:→ liataian: 了什麽事呢?! 02/02 19:43
11F:→ liataian: 谢谢刚刚搞懂了!! 02/02 23:10