Java TCP Socket发送字节数组(Java TCP Socket send byte array)
我正在尝试使用Java TCP套接字构建文件服务器。 当我尝试发送文件超过几KB时,我不断收到错误消息。 错误如下:
Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at fileServer.TCPServer.main(TCPServer.java:193)
我正在创建这样的输出流:
OutputStream output = clientSocket.getOutputStream()
错误来自这一行:
output.write(sendData, 0, sendData.length)
其中,sendData是一个字节数组,我手工制作一个与协议一致的“协议”,该协议是28个字节的字节以及文件。 它错误出来的文件大约是780kB,其中一个2kB文件完美。 有任何想法吗?
编辑:一些添加我如何制作套接字的上下文。
Socket clientSocket = listenSocket.accept(); System.out.println("server is listening..."); DataInputStream input = new DataInputStream(clientSocket.getInputStream()); OutputStream output = clientSocket.getOutputStream(); //receive the request packet //int nb = input.readInt(); System.out.println("Read Length " + "28"); byte[] sentence = new byte[28]; for(int i=0; i<28; i++){ sentence[i] = input.readByte(); }
这就是我发送数据的方式:sendData是我构建发送的字节数组tArray是我正应对sendData发送的文件的字节数组
for(int i = 0; i<filSize; i++){ //loads into the packet being built //needed to minus 36 since all the header info endData[i+36] = tArray[i]; } System.out.println("send packet size: " + sendData.length); System.out.print(sendData); System.out.println("File size is: " + filSize); int sendDataLength = sendData.length; try{ output.write(sendData, 0, sendDataLength); }catch (IOException e){ System.out.println("Error: " + e.getMessage()); } clientSocket.close();
编辑2:我用了一个try catch,现在得到这个错误:软件导致连接中止:套接字写入错误
I'm trying to build a file server using Java TCP sockets. I keep getting an error when I try to send a file over a few KB. The error is as follows:
Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at fileServer.TCPServer.main(TCPServer.java:193)
I am creating the output stream like this:
OutputStream output = clientSocket.getOutputStream()
And the error originates from this line:
output.write(sendData, 0, sendData.length)
Where sendData is a byte array I hand make to an agreed upon 'protocol' that is 28 header bytes along with the file. The file it is erroring out on is about 780kB where a 2kB file works perfect. Any ideas?
EDIT: some added context of how I'm making the socket.
Socket clientSocket = listenSocket.accept(); System.out.println("server is listening..."); DataInputStream input = new DataInputStream(clientSocket.getInputStream()); OutputStream output = clientSocket.getOutputStream(); //receive the request packet //int nb = input.readInt(); System.out.println("Read Length " + "28"); byte[] sentence = new byte[28]; for(int i=0; i<28; i++){ sentence[i] = input.readByte(); }
And this is how I'm sending the data: sendData is the bytearray I built to send tArray is the array of bytes of the file that I'm coping into sendData to send
for(int i = 0; i<filSize; i++){ //loads into the packet being built //needed to minus 36 since all the header info endData[i+36] = tArray[i]; } System.out.println("send packet size: " + sendData.length); System.out.print(sendData); System.out.println("File size is: " + filSize); int sendDataLength = sendData.length; try{ output.write(sendData, 0, sendDataLength); }catch (IOException e){ System.out.println("Error: " + e.getMessage()); } clientSocket.close();
EDIT 2: I used a try catch and got this error now: Software caused connection abort: socket write error
原文:https://stackoverflow.com/questions/5944948
最满意答案
你可以这样做: -
$final_array = array(); foreach($Array1 as $key=>$val){ if(is_array($val) && is_array($Array2[$key])){ if(array_keys($val)[0] == array_keys($Array2[$key])[0]){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; } } } print_r($final_array);
输出: - https://eval.in/834913
一个更好的方法: -
$final_array = array(); if(count($Array1) >= count($Array2)){ foreach($Array1 as $key=>$val){ if(is_array($val) && is_array($Array2[$key])){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; }else{ $final_array[$key] = $val; } } } if(count($Array1) < count($Array2)){ foreach($Array2 as $key=>$val){ if(is_array($val) && is_array($Array1[$key])){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; }else{ $final_array[$key] = $val; } } } print_r($final_array);
输出: - https://eval.in/835143
You can do it like below:-
$final_array = array(); foreach($Array1 as $key=>$val){ if(is_array($val) && is_array($Array2[$key])){ if(array_keys($val)[0] == array_keys($Array2[$key])[0]){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; } } } print_r($final_array);
Output:- https://eval.in/834913
A slight better approach:-
$final_array = array(); if(count($Array1) >= count($Array2)){ foreach($Array1 as $key=>$val){ if(is_array($val) && is_array($Array2[$key])){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; }else{ $final_array[$key] = $val; } } } if(count($Array1) < count($Array2)){ foreach($Array2 as $key=>$val){ if(is_array($val) && is_array($Array1[$key])){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; }else{ $final_array[$key] = $val; } } } print_r($final_array);
Output:- https://eval.in/835143
相关问答
更多-
您可以使用array_keys并传递第二个参数来过滤返回的键,以仅包含max键。 然后,您可以使用array_reduce和一个检查字符串长度并抛出最短字符串的函数找到最长的键,如下所示: $array = array( 'abc' => 10, 'def' => 8, 'fff' => 3, 'abcr' => 10, 'adsfefs' => 10 ); $keys = array_keys($array, max($array)) ...
-
你可以这样做: - $final_array = array(); foreach($Array1 as $key=>$val){ if(is_array($val) && is_array($Array2[$key])){ if(array_keys($val)[0] == array_keys($Array2[$key])[0]){ $final_array[$key][array_keys($val)[0]] = $Array1[$key][arr ...
-
尝试这个: var keys = []; for (var key in dictionary) { if (dictionary.hasOwnProperty(key)) { keys.push(key); } } hasOwnProperty是必需的,因为可以将键插入到dictionary的原型对象中。 但是您通常不希望列表中包含这些键。 例如,如果你这样做: Object.prototype.c = 3; var dictionary = {a: 1, b: 2}; 然后做一个循环 ...
-
我假设你的阵列是这样的 $arrayName = array( '0' => array("Name" => "John Test"), '1' => array("Archived-On" => "2016-05-02 18:20:26"), '2' => array( "Phone" => "2132918968", "DOB" => "1800-01-01 00:00:00", "Referred-By-Practice" ...
-
boost :: multi_index是你问题的答案。 有关如何使用它的更多信息,请参阅那里 。 boost::multi_index is the answer to your problem. See there for more information on how to use it.
-
将多个关联数组合并到一个关联数组的单个数组中(Merge multiple associative arrays to a single array of associative arrays)[2023-01-26]
我相信这是你的阵容 $ids = array('0' => '7','1' => '8','2' => '9'); $names = array('0' => 'Name 1','1' => 'Name 2','2' => 'another name'); $marks = array('0' => '8','1' => '5','2' => '8'); $grade = array('0' => '4','1' => '2.5','2' => '4'); #New Keys $keys = array( ... -
PHP:如何合并键相同的关联数组的值?(PHP: How to merge the values of associative array whose keys are same?)[2023-08-29]
您应该在HTML代码中使用数组命名来获取所有业余爱好复选框,如下所示: " "...就像你可以为教育复选框做的那样。 现在你什么时候print_r($_POST['Hobbies']) 。 这将为您提供所 ... -
一种方法是structs Dictionary 。 考虑: struct Person { var firstName: String var lastName: String } var peopleByID = [ Int: Person ]() peopleByID[1] = Person(firstName: "First", lastName: "Last") peopleByID[27] = Person(firstName: "Another", lastName: "Las ...
-
PHP - 合并两个关联数组(如果键存在,则添加值)(PHP - Merge two associative arrays (add values if key exists))[2022-09-09]
以最短的格式将$b合并到$a : foreach ($b as $key => $value) { $a[$key] += $value; } 例 但是,最好在写入之前检查数组键是否存在: if (!array_key_exists($key, $a)) { $a[$key] = 0; } $a[$key] += $value; At its shortest form where you want to merge $b into $a: foreach ($b as $key => ... -
Codeigniter - 将多个关联数组与条件合并(Codeigniter - merge multiple associative array with condition)[2024-01-07]
这应该有效,假设您在所有子数组中都有"b"索引。 $array1 = array(); $array1[] = array("a" => "m1", "b" => "x2", "c" => null); $array1[] = array("a" => "n1", "b" => "y2"); $array2 = array(); $array2[] = array("b" => "x2", "c" => "p1"); $array2[] = array("a" => null, "b" => "x2", ...