java - 初学者 Java Socket 编程错误

标签 java sockets client port

我开始编写我的第一个 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/

相关文章:

java - 如何将两个套接字绑定(bind)到两个单独程序上的同一端口?

java - 验证txt文件

java - 将 sqlMapConfig 保留在 jar/classpath 之外

python - 如何在 Linux Azure Web 应用程序上安装和配置 Oracle Instant Client

sockets - 如何安全设置Unix域套接字的组所有权?

javascript - Discord.js等待网络套接字连接

android - 为什么服务器/客户端套接字停止工作

java - 启动 Wildfly 11 App Server 时出错 - 名为 null 的持久性单元

java - 无法在下一个屏幕上看到汉堡菜单

C++网络编程