用数据包socket实现双工通信报参数不合法错误

javacankillyou 2015-06-14 08:13:25
虚心请教大家。我用数据包socket实现一个双工通信的过程。而在其中客户端和服务器的代码基本一样,知识send和receive换了一个位置。但是运行时,发现一个没错,一个报出了参数不合法异常。请大家帮帮忙看哪里出错了。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;


public class myDatagramSocket extends DatagramSocket {
final int max_len=1000;
public myDatagramSocket(int myport) throws SocketException {
super(myport);
}
public void sendMessage(InetAddress receiverAddr,int receiverPort,String message){
byte[] buffer=new byte[max_len];
buffer=message.getBytes();
DatagramPacket mypacket=new DatagramPacket(buffer,max_len,receiverAddr,receiverPort );
try {
this.send(mypacket);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public String receiveMessage(){
byte[] buffer=new byte[max_len];
DatagramPacket mypacket=new DatagramPacket(buffer, max_len);
try {
this.receive(mypacket);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
String message=new String(buffer);
return message;
}

}

继承datagramSocket的类。
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;


public class Example2SenderReceiver {

public static void main(String[] arg){
if(arg.length!=4){
System.out.println("此程序需要输入四个命令参数");
return;
}else{
try {
InetAddress addr=InetAddress.getByName(arg[0]);
int myport=Integer.parseInt(arg[1]);
int receiverPort=Integer.parseInt(arg[2]);
String message=arg[3];
myDatagramSocket mysocket=new myDatagramSocket(myport);
mysocket.sendMessage(addr,receiverPort,message);
System.out.println(mysocket.receiveMessage());
mysocket.close();
} catch (UnknownHostException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}

}
}

客户端
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;


public class Example2ReceiverSender {

public static void main(String[] arg){
if(arg.length!=4){
System.out.println("此程序需要输入四个命令参数");
return;
}else{
try {
InetAddress addr=InetAddress.getByName(arg[0]);
int myport=Integer.parseInt(arg[1]);
int receiverPort=Integer.parseInt(arg[2]);
String message=arg[3];
myDatagramSocket mysocket=new myDatagramSocket(myport);
System.out.println(mysocket.receiveMessage());
mysocket.sendMessage(addr, receiverPort, message);
mysocket.close();
} catch (UnknownHostException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}

}
}

服务端。
Exception in thread "main" java.lang.IllegalArgumentException: illegal length or offset
at java.net.DatagramPacket.setData(Unknown Source)
at java.net.DatagramPacket.<init>(Unknown Source)
at java.net.DatagramPacket.<init>(Unknown Source)
at myDatagramSocket.sendMessage(myDatagramSocket.java:16)
at Example2SenderReceiver.main(Example2SenderReceiver.java:19)

报错信息。
我客户端我设置的参数是:127.0.0.1 8000 9000 客户端发给服务器
服务端设置的信息参数是:127.0.0.1 9000 8000 服务端发给客户端

谢谢大家。
...全文
150 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
javacankillyou 2015-06-14
  • 打赏
  • 举报
回复
知道了 DatagramPacket mypacket=new DatagramPacket(buffer,max_len,receiverAddr,receiverPort );这里出错了。不要用max_len。应该用buffer.length

62,614

社区成员

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

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