我开始编写我的第一个 Java 网络程序,长话短说,我很难确保我采用了正确的方法。我们的教授为我们提供了一个服务器程序来测试这个 UDP 客户端,但我遇到了一些似乎无法消除的错误。具体来说,我收到 IO 异常,“连接被拒绝”或“没有到主机的路由”异常。
public class Lab2Client {
/**
* @param args[1] == server name, args[2] == server port, args[3] == myport
*/
public static void main(String[] args) {
//Serverport is set to 10085, our client is 10086
try {
Socket echoSocket = new Socket(args[0],Integer.parseInt(args[2]));
System.out.println("Server connection Completed\n");
DataOutputStream output = new DataOutputStream(echoSocket.getOutputStream());
byte[] toSend = new byte[5];
toSend[0] = 12; toSend[1] = 34;//Code Number
toSend[2] = 15;//GroupId
toSend[3] = 86;toSend[4] = 100;//Port number in Little Endian Order
output.write(toSend);
System.out.println("Sent Request. Waiting for reply...\n");
DataInputStream input = new DataInputStream(echoSocket.getInputStream());
byte[] toRecieve = new byte[]{0,0,0,0,0,0,0,0};
input.read(toRecieve);
checkMessage(toRecieve);
}
catch (UnknownHostException e) {
System.err.println("Servername Incorrect!");
System.exit(1);
}
catch (IOException e){
System.err.println("IO Exception. Exiting...");
System.err.println(e);
System.exit(1);
}
}
我对于用 Java 接收消息的实现也有一些疑问。我将得到一个包含以下内容的数据报:
a) 3 个格式化字节(对问题不重要)以及 IP 和端口号
或
b) 3 个格式化字节和一个端口。
使用 DataInputStream 是执行此操作的正确方法吗?我知道使用包含 9 个元素的数组比动态分配 5 个或 9 个元素的数组更懒惰,但现在我只是想让这个工作正常进行。话虽如此,是否有人会建议采用不同的方法?
最佳答案
您无需使用 DataOutputStream
包装 Socket.getOuputStream()
返回的流 - 它已经是 DataOutputStream
在这一行中:
Socket echoSocket = new Socket(args[0],Integer.parseInt(args[2]));
我想它应该是args[1],而不是args[0]。
这里您必须将整数值转换为其字节表示形式:
toSend[3] = 10086 & 0xFF;toSend[4] = 10086>>8; //Port number in Little Endian Order
回答您的问题:情况b,因为您没有发送IP
关于java - 初学者 Java Socket 编程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666334/