【问题标题】:Converting Python socket code to Java socket code将 Python 套接字代码转换为 Java 套接字代码
【发布时间】:2014-01-19 19:55:48
【问题描述】:

鉴于此 python 脚本:

import socket
import sys
import time

buf0 = "03".decode('hex')
buf1 = "0300".decode('hex')
buf2 = "8028".decode('hex')
package = buf0 + buf1 + buf2
HOST = "192.168.0.2"
PORT = 22
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(3)
s.connect((HOST,PORT))
s.send(package)
rec = s.recv(1024)
s.close()

我需要对 Java 做同样的事情,现在我正在使用这个函数将 hexstring 转换为 ascii 字符串:

public static String convertHexToString(String hex) {

StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
for (int i = 0; i < hex.length() - 1; i += 2) {

    // grab the hex in pairs
    String output = hex.substring(i, (i + 2));
    // convert hex to decimal
    int decimal = Integer.parseInt(output, 16);
    // convert the decimal to character
    sb.append((char) decimal);

    temp.append(decimal);
}

return sb.toString();
}

我已经使用 Java 套接字进行了一些实验,但没有成功 - 应该接收数据包的应用程序接受了连接,但在接收数据包时什么也不做,所以我想我做错了什么。

使用 python 脚本一切正常。我可能在一些愚蠢的事情上失败了。有什么想法吗?

这里是java代码:

String buff0 = "03";
String buff1 = "0300";
String buff2 = "8028";
String pack = convertHexToString(buff0) + convertHexToString(buff1) + convertHexToString(buff2);

Socket socket = null;
String host = "192.168.0.2";

try {
    socket = new Socket(Inet4Address.getByName(host), 22);
    System.out.println("connected");
} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

BufferedReader in = null;
PrintStream out = null;

try {
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintStream(socket.getOutputStream(), true);
    out.print(pack);
    System.out.println("sent");

    in.read();
    System.out.println("received");

    out.close();
    in.close();
} catch (IOException e) {
    e.printStackTrace();
}

我重写了很多次,但总是没有好结果。

【问题讨论】:

  • 请在您的问题中包含您的 Java 套接字代码。
  • 看起来您有两个客户端套接字。使用套接字编程,一侧需要是绑定到端口的“服务器”,并侦听并接受传入的连接,而另一侧是仅连接到主机的“客户端”。您必须将服务器套接字添加到您的 Java 代码或 Python 代码或两者中。
  • @Pace 不,我将数据包发送到正在侦听连接的专有软件,我只需要开发客户端,现在 python 工作正常。我只需要帮助将其翻译成 Java。
  • 你有多大把握你发送的是正确的东西(或任何东西)? PrintStream 的打印方法将根据可能不兼容 ASCII 的默认平台编码对字符串进行编码。
  • @Pace 我不确定内容的有效性,这就是我寻求帮助的原因,python 脚本工作正常,但我无法对 Java 脚本做同样的事情。

标签: java python sockets io


【解决方案1】:

解决了发送字节数组的问题:

    String buff0 = "03";
    String buff1 = "0300";
    String buff2 = "8028";

    String packet = buff0 + buff1 + buff2;

    byte[] b = new BigInteger(packet,16).toByteArray();



    try {
        Socket socket = new Socket("192.168.0.2", 22);
        OutputStream socketOutputStream = socket.getOutputStream();
        socketOutputStream.write(b);
        InputStream socketInput = socket.getInputStream();
        System.out.println(socketInput.read());
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

所以我基本上得到了十六进制字符串,将其转换为字节数组并使用 OutputStream 发送。

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 2012-08-27
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多