Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ObjectOutputStream.writeBytes(字符串)意外的输出值 我使用了 ObjutOutsPotrass发送对象…”); ArrayList tempoStr=StringToByteArray(o); 字符串msg=“”; 用于(字符串指令:tempoStr) msg+=inStr; System.out.println(“我实际发送的消息是\n”+msg);//控制台中的结果正是我期望的消息。 os.writeBytes(msg);//然后当我在服务器上检查时:在开始时出现意外的附加字符。 os.flush(); //pw.write(msg); //pw.flush(); System.out.println(“发送成功”); }捕获(IOE异常){ e、 printStackTrace(); System.out.println(“发送时发生XX.Exception:”+e.toString()+“\n”+e.getCause()); System.out.println(“套接字创建失败或发送时出错”); } }_Java_Android_Objectoutputstream - Fatal编程技术网

Java ObjectOutputStream.writeBytes(字符串)意外的输出值 我使用了 ObjutOutsPotrass发送对象…”); ArrayList tempoStr=StringToByteArray(o); 字符串msg=“”; 用于(字符串指令:tempoStr) msg+=inStr; System.out.println(“我实际发送的消息是\n”+msg);//控制台中的结果正是我期望的消息。 os.writeBytes(msg);//然后当我在服务器上检查时:在开始时出现意外的附加字符。 os.flush(); //pw.write(msg); //pw.flush(); System.out.println(“发送成功”); }捕获(IOE异常){ e、 printStackTrace(); System.out.println(“发送时发生XX.Exception:”+e.toString()+“\n”+e.getCause()); System.out.println(“套接字创建失败或发送时出错”); } }

Java ObjectOutputStream.writeBytes(字符串)意外的输出值 我使用了 ObjutOutsPotrass发送对象…”); ArrayList tempoStr=StringToByteArray(o); 字符串msg=“”; 用于(字符串指令:tempoStr) msg+=inStr; System.out.println(“我实际发送的消息是\n”+msg);//控制台中的结果正是我期望的消息。 os.writeBytes(msg);//然后当我在服务器上检查时:在开始时出现意外的附加字符。 os.flush(); //pw.write(msg); //pw.flush(); System.out.println(“发送成功”); }捕获(IOE异常){ e、 printStackTrace(); System.out.println(“发送时发生XX.Exception:”+e.toString()+“\n”+e.getCause()); System.out.println(“套接字创建失败或发送时出错”); } },java,android,objectoutputstream,Java,Android,Objectoutputstream,我知道服务器必须如何接收我的消息: msg的每个字符都存储在一个字节数组中(received_msg[])。我也知道服务器期望的MSG(通过另一个C++应用程序)。 我发送的数据是由1字节数组和2个其他字符串组成的字符串 我的问题是: 我已经使用了PrintWriter来发送数据,但是我的服务器总是在received\u msg中的索引24到28处显示一些奇怪的字符。 我尝试了很多转换来修复它,但是放弃了。 因此,我尝试使用ObjectOutputStream发送消息。 当客户端使用Object

我知道服务器必须如何接收我的消息: msg的每个字符都存储在一个字节数组中(received_msg[])。我也知道服务器期望的MSG(通过另一个C++应用程序)。 我发送的数据是由1字节数组和2个其他字符串组成的字符串

我的问题是: 我已经使用了
PrintWriter
来发送数据,但是我的服务器总是在
received\u msg
中的索引24到28处显示一些奇怪的字符。 我尝试了很多转换来修复它,但是放弃了。 因此,我尝试使用
ObjectOutputStream
发送消息。 当客户端使用
ObjectOutputStream.writeBytes()
时,服务器几乎显示正确接收的消息。几乎是因为在开头添加了一些字符

诸如此类: 在服务器接收到的消息中:

index 0: ┐

index 1: i

index 2: ''

index 3: |

index 4: I //beginning of the message I actually wanted to send

index 5: S //every char following index 4 is good.
而我在“我”之前什么也没寄。 我发送的消息开头是这样的:ISOXXXXX

所以我想知道是否有任何方法可以检索ObjectOutputStream.writeBytes的实际输出。我知道它是输出,而不是输入,但这会帮助我理解它是如何添加奇怪的标题的

提前谢谢你的建议

我的发送功能

private void send(String o) {
    System.out.println("socket");
    try {
        this.socket = new Socket(serverIP, portNumber);
        os = new ObjectOutputStream(socket.getOutputStream());
        //OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
        //InputStreamReader in = new InputStreamReader(socket.getInputStream());
        // PrintWriter pw = new PrintWriter(out, true);

        System.out.println("Connected to server : " + this.socket.getInetAddress() + " on port " + this.socket.getPort());
        System.out.println("from local address: " + this.socket.getLocalAddress() + " and port: " + this.socket.getLocalPort());
        System.out.println("02. -> Sending an object...");

        ArrayList<String>  tempoStr = StringToByteArray(o);
        String msg="";
        for(String inStr :tempoStr)
             msg+=inStr;
        System.out.println("the message I ACTUALLY send is\n"+msg); //the result in console is EXACTLY the message I expect.
        os.writeBytes(msg); //then when I check on the server:  unexpected additionnal chars at the beginning.
        os.flush();
       // pw.write(msg);
       //pw.flush();
        System.out.println("send success");
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("XX. Exception Occurred on Sending:" +  e.toString() +"\n"+ e.getCause());
        System.out.println("Socket creation failure or error on sending.");

    }
}
private void发送(字符串o){
System.out.println(“套接字”);
试一试{
this.socket=新套接字(serverIP,端口号);
os=新的ObjectOutputStream(socket.getOutputStream());
//OutputStreamWriter out=新的OutputStreamWriter(socket.getOutputStream());
//InputStreamReader in=新的InputStreamReader(socket.getInputStream());
//PrintWriter pw=新的PrintWriter(输出,真);
System.out.println(“连接到服务器:”+this.socket.getInetAddress()+“在端口上”+this.socket.getPort());
System.out.println(“从本地地址:“+this.socket.getLocalAddress()+”和端口:“+this.socket.getLocalPort()”);
System.out.println(“02.->发送对象…”);
ArrayList tempoStr=StringToByteArray(o);
字符串msg=“”;
用于(字符串指令:tempoStr)
msg+=inStr;
System.out.println(“我实际发送的消息是\n”+msg);//控制台中的结果正是我期望的消息。
os.writeBytes(msg);//然后当我在服务器上检查时:在开始时出现意外的附加字符。
os.flush();
//pw.write(msg);
//pw.flush();
System.out.println(“发送成功”);
}捕获(IOE异常){
e、 printStackTrace();
System.out.println(“发送时发生XX.Exception:”+e.toString()+“\n”+e.getCause());
System.out.println(“套接字创建失败或发送时出错”);
}
}
PS:我无法更改服务器代码。

不要使用ObjectOutputStream(仅限java)。有人可能会使用DataOutputStream,但这里您似乎想要一些简单的东西

byte[] a = ...
String b = ...

OutputStream out = ...
out.write(a);
out.write((b + '\u0000').getBytes("UTF-8")); // Or "Windows-1252" / "ISO-8859-1"
out.flush();
我添加了一个
'\0'
,它在C/C++中用于终止字符串(二进制输出)。 或者可能需要
“\r\n”
文本输出

编码是明确给出的。

不要使用ObjectOutputStream(仅限java)。有人可能会使用DataOutputStream,但这里您似乎想要一些简单的东西

byte[] a = ...
String b = ...

OutputStream out = ...
out.write(a);
out.write((b + '\u0000').getBytes("UTF-8")); // Or "Windows-1252" / "ISO-8859-1"
out.flush();
我添加了一个
'\0'
,它在C/C++中用于终止字符串(二进制输出)。 或者可能需要
“\r\n”
文本输出


编码是显式给出的。

OOS的.writeString()将写入修改后的UTF,这肯定不是您想要的。还有,编码是什么?ASCII?ObjectOutputStream使用ASCII编码将Java对象的基本数据类型和图形写入OutputStream。我发送的消息是:msg=“ISOXXXXXXXXXXXXXXXXP������ÀXXXXXX��&XXXXXXX“,其中X是数字。我只想把它像那样发送到服务器。服务器完全接收到它,但似乎在开头添加了其他字符。OOS的.writeString()将写入修改后的UTF,这肯定不是您想要的。还有,编码是什么?ASCII?ObjectOutputStream使用ASCII编码将Java对象的基本数据类型和图形写入OutputStream。我发送的消息是:msg=“ISOXXXXXXXXXXXXXXXXP������ÀXXXXXX��&XXXXXXX“,其中X是数字。我只想把它像那样发送到服务器。服务器完全接收到它,但似乎在开头添加了其他字符。我找到了以下链接:。他们说:“原始数据(不包括可序列化字段和可外部化数据)在块数据记录中写入ObjectOutputStream。块数据记录由头和数据组成。块数据头由标记和头后面的字节数组成。”我想我需要的是去掉header,这里的建议是使用
(文件)OutputStream
,也就是说:直接写入原始字节。从你的评论来看,字节部分似乎也是文本?java中的文本在内部是Unicode格式的,因此要在某些编码X中获取字节,需要指定X,或者反过来,要从字节中获取文本字符串,最好指定它们的编码。我尝试了您的解决方案Joop Eggen,但我仍然有标题。我将尝试使用FileInput/OutputStream链接DataInput/OutputStream。我已经在尝试写入原始字节上浪费了很多时间,我更喜欢发送字符串…IMHO DataInput/OutputStream不会更快地提供解决方案。以数字形式转储字节,检查它们来自何处。它们都是ASCII编码的。是的,字节部分也是文本。只是当我改变写入方式(PrinterWrite、ObjectOutputStream.writeBytes等)时,这一部分会发生变化,它们对文本的结果都与字节部分不同。我发现,对于ObjectOutputStream.writeBytes,消息是通过