我已经用套接字卡住了4h,我使用的方式是只有一个应用程序作为客户端和服务器,一旦客户端连接, 它将与新客户端一起打开theard,并等待消息。
一旦消息发送到服务器,客户端将收到响应,该部分正在正常工作。
客户专区的一部分:
while (true) { InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream()); BufferedReader BR = new BufferedReader(IR); PrintStream PS = new PrintStream(clientSocket.getOutputStream()); String message = BR.readLine(); if (message != null) { System.out.println(clientSocket.getInetAddress() + ":" + clientSocket.getPort() + " has connected."+message); if (message.equals("exit")) { PS.println("Exiting..."); exit(); } else if (message.equals("list")) { getList(PS); } else if ((message.contains("get") && (message.contains(",") && (message.contains(" "))))) { String[] spliter = message.split(" "); String[] file = spliter[1].split(","); String file_name = file[0]; String file_md5 = file[1]; getFile(file_name, file_md5, clientSocket); } } else { break; } }
服务器支持2条消息,第一条是“列表”,发送一条命令是“获取值”。
如果客户端将请求命令“列表”,它将运行以下命令:有一个“服务器/客户端”,它正在发送请求并接收一个行字符串,并且 它没有任何问题,我正在从服务器接收文件列表。
PrintStream PS = new PrintStream(clientSocket.getOutputStream()); PS.println("list"); InputStreamReader IR = new InputStreamReader(clientSocket.getInputStream()); BufferedReader BR = new BufferedReader(IR); String lista_plikow = BR.readLine(); if ( lista_plikow != null) { return lista_plikow; }
但我有问题,发送文件,在使用代码上发现的插座计算器,但”接收”不工作,有我收到 的功能,循环始终为0(即使第一个字节长度是正确的),但在字节长度是正确的,它使用的是新创建的文件,但没有任何反应,该文件始终处于使用状态,并且具有0个字节而不是PS.println的内容。
PrintStream PS = new PrintStream(clientSocket.getOutputStream()); PS.println("get "+filename+","+file_md5); int bytesRead; int current = 0; FileOutputStream fos = null; BufferedOutputStream bos = null; try { byte [] mybytearray = new byte [Integer.parseInt(size)]; InputStream is = clientSocket.getInputStream(); fos = new FileOutputStream(filename + ".recived"); bos = new BufferedOutputStream(fos); bytesRead = is.read(mybytearray,0,mybytearray.length); current = bytesRead; System.out.println("X" + bytesRead); do { bytesRead = is.read(mybytearray, current, (mybytearray.length-current)); System.out.println(bytesRead + " = " + current + " " + (mybytearray.length-current)); if(bytesRead >= 0) current += bytesRead; System.out.println(bytesRead); } while(bytesRead > -1); bos.write(mybytearray, 0 , current); bos.flush(); System.out.println("File " + "recived." +filename.replace(":", " ") + " downloaded (" + current + " bytes read)"); }catch (Exception e) { System.out.println(e.getMessage()); }
脚本的最后一部分是“ PS.println(“ get” + filename +“,” + file_md5);“。正是 在做这个,发送工作正常:
FileInputStream fis = null; BufferedInputStream bis = null; OutputStream os = null; String the_file = TorrentAppGui.folder+"\\"+file_name.replace(":", " "); File myFile = new File (the_file); byte [] mybytearray = new byte [(int)myFile.length()]; fis = new FileInputStream(myFile); bis = new BufferedInputStream(fis); bis.read(mybytearray,0,mybytearray.length); os = clientSocket.getOutputStream(); System.out.println("Sending " + the_file + "(" + mybytearray.length + " bytes)"); os.write(mybytearray, 0, mybytearray.length); os.flush(); System.out.println("Done.");
我不知道为什么我不能保存“ get ”命令收到的字节,您有什么想法吗?我知道只有“ receve”功能 不起作用,因为如果我通过telnet登录到应用程序,则可以在控制台中获取文件,但无法达到目标。从cli看屏幕。
您不能在同一套接字上混合使用缓冲流和非缓冲流/读取器/写入器。您将丢失缓冲区中的数据。 在套接字的使用寿命内使用相同的流对。在这种情况下,我将使用DataInputStream和DataOutputStream,以及readUTF()/writeUTF()消息和文件名的方法。您还需要在文件之前发送文件长度,除非文件是通过连接发送的最后一件事:否则,对等方将不知道何时停止读取文件并返回并重新开始读取消息。
DataInputStream
DataOutputStream
readUTF()/writeUTF()