Java 客户端套接字将不会从服务器接收数据
我的问题是,在我的客户机中,Java 客户端套接字将不会从服务器接收数据,java,sockets,printwriter,datainputstream,inputstreamreader,Java,Sockets,Printwriter,Datainputstream,Inputstreamreader,我的问题是,在我的客户机中,dis.read()返回-1,导致它从未实际收到文件。我能想到的唯一一件事是,因为我在本节之前使用了PrintWriter和BufferedReader,所以dis.read()认为所有数据都已经收到了 客户端代码: public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException { Socket
dis.read()
返回-1
,导致它从未实际收到文件。我能想到的唯一一件事是,因为我在本节之前使用了PrintWriter
和BufferedReader
,所以dis.read()
认为所有数据都已经收到了
客户端代码:
public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
Socket client = new Socket(serverAddress, port);
client.setSoTimeout(5000);
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
try {
out.println("101|" + fileName + "\n");
if (input.readLine().equals("201")) {
int br;
byte[] data = new byte[4096];
DataInputStream dis = new DataInputStream(client.getInputStream());
FileOutputStream fos = new FileOutputStream(fileOut);
while ((br = dis.read(data, 0, data.length)) != -1){
fos.write(data, 0, br);
}
fos.close();
dis.close();
}
} catch (SocketTimeoutException ste) {
ste.printStackTrace();
client.close();
}
}
private void sendFile(String filename, Socket client) throws IOException {
int br;
byte[] data = new byte[4096];
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println("201\n");
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
FileInputStream fis = new FileInputStream(MeshFS.properties.getProperty("repository") + filename);
while ((br = fis.read(data, 0, data.length)) != -1) {
dos.write(data, 0, br);
dos.flush();
}
fis.close();
dos.close();
}
private String receiveRequest(Socket client) {
String requestPart;
String requestFull = "";
try {
BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
while (((requestPart = input.readLine()) != null) && (requestFull.length() < 2048)) {
if (requestPart.equals("")) break;
requestFull = requestFull + requestPart;
}
return requestFull;
} catch (IOException ioe) {
return requestFull;
}
}
private void processRequest(String request, Socket out) {
if (request != null) {
try {
String[] requestParts = request.split("\\|");
if (requestParts[0].equals("101")) { //101:Get file
sendFile(requestParts[1], out);
} else {
badRequest(out, request);
}
} catch (Exception e) {
badRequest(out, request);
e.printStackTrace();
}
}
}
public void run() {
while (!Thread.interrupted()) {
try {
server.setSoTimeout(1000);
Socket client = server.accept();
client.setSoTimeout(timeout);
processRequest(receiveRequest(client), client);
client.close();
} catch (SocketTimeoutException ste) {
} catch (IOException io) {
io.printStackTrace();
}
}
System.out.println("Socket closed");
}
服务器代码:
public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
Socket client = new Socket(serverAddress, port);
client.setSoTimeout(5000);
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
try {
out.println("101|" + fileName + "\n");
if (input.readLine().equals("201")) {
int br;
byte[] data = new byte[4096];
DataInputStream dis = new DataInputStream(client.getInputStream());
FileOutputStream fos = new FileOutputStream(fileOut);
while ((br = dis.read(data, 0, data.length)) != -1){
fos.write(data, 0, br);
}
fos.close();
dis.close();
}
} catch (SocketTimeoutException ste) {
ste.printStackTrace();
client.close();
}
}
private void sendFile(String filename, Socket client) throws IOException {
int br;
byte[] data = new byte[4096];
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println("201\n");
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
FileInputStream fis = new FileInputStream(MeshFS.properties.getProperty("repository") + filename);
while ((br = fis.read(data, 0, data.length)) != -1) {
dos.write(data, 0, br);
dos.flush();
}
fis.close();
dos.close();
}
private String receiveRequest(Socket client) {
String requestPart;
String requestFull = "";
try {
BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
while (((requestPart = input.readLine()) != null) && (requestFull.length() < 2048)) {
if (requestPart.equals("")) break;
requestFull = requestFull + requestPart;
}
return requestFull;
} catch (IOException ioe) {
return requestFull;
}
}
private void processRequest(String request, Socket out) {
if (request != null) {
try {
String[] requestParts = request.split("\\|");
if (requestParts[0].equals("101")) { //101:Get file
sendFile(requestParts[1], out);
} else {
badRequest(out, request);
}
} catch (Exception e) {
badRequest(out, request);
e.printStackTrace();
}
}
}
public void run() {
while (!Thread.interrupted()) {
try {
server.setSoTimeout(1000);
Socket client = server.accept();
client.setSoTimeout(timeout);
processRequest(receiveRequest(client), client);
client.close();
} catch (SocketTimeoutException ste) {
} catch (IOException io) {
io.printStackTrace();
}
}
System.out.println("Socket closed");
}
private void sendFile(字符串文件名,套接字客户端)引发IOException{
int-br;
字节[]数据=新字节[4096];
PrintWriter out=新的PrintWriter(client.getOutputStream(),true);
out.println(“201\n”);
DataOutputStream dos=新的DataOutputStream(client.getOutputStream());
FileInputStream fis=新的FileInputStream(MeshFS.properties.getProperty(“存储库”)+文件名);
while((br=fis.read(data,0,data.length))!=-1){
dos.write(数据,0,br);
dos.flush();
}
fis.close();
dos.close();
}
私有字符串receiveRequest(套接字客户端){
字符串请求部分;
字符串requestFull=“”;
试一试{
BufferedReader输入=新的BufferedReader(新的InputStreamReader(client.getInputStream());
而(((requestPart=input.readLine())!=null)和(&(requestFull.length()<2048)){
如果(requestPart.equals(“”)中断;
requestFull=requestFull+requestPart;
}
全额退货;
}捕获(ioe异常ioe){
全额退货;
}
}
私有void processRequest(字符串请求、套接字输出){
if(请求!=null){
试一试{
字符串[]requestParts=request.split(“\\\\”);
if(requestParts[0].equals(“101”){//101:Get文件
sendFile(requestParts[1],out);
}否则{
坏请求(out,request);
}
}捕获(例外e){
坏请求(out,request);
e、 printStackTrace();
}
}
}
公开募捐{
而(!Thread.interrupted()){
试一试{
服务器设置超时(1000);
Socket client=server.accept();
客户端设置超时(超时);
processRequest(接收方请求(客户),客户);
client.close();
}捕捉(SocketTimeoutException ste){
}捕获(io异常){
io.printStackTrace();
}
}
System.out.println(“插座关闭”);
}
有没有什么东西我遗漏了或忘了包括在内?我不是在冲洗什么东西还是在清理什么东西?好吧,我想我发现了错误。我做了一些实验,发现如果多个对象试图读取,
InputStream
的行为会很奇怪。在您的情况下,很可能是客户端的receiveFile
方法中的BufferedReader
和DataInputStream
通过尝试读取相同的inputStream
导致了问题。我建议使用DataInputStream
也读取第一行,这样就不必创建BufferedReader
。即使不推荐使用DataInputStream.readLine()
方法,但在您的情况下,它应该仍然很好
我编辑了clientsreceiveFile
方法,使用DataInputStream
读取第一行。希望它能起作用
public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
Socket client = new Socket(serverAddress, port);
client.setSoTimeout(5000);
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
DataInputStream dis = new DataInputStream(client.getInputStream());
try {
out.println("101|" + fileName + "\n");
if (dis.readLine().equals("201")) {
int br;
byte[] data = new byte[4096];
FileOutputStream fos = new FileOutputStream(fileOut);
while ((br = dis.read(data, 0, data.length)) != -1){
fos.write(data, 0, br);
}
fos.close();
dis.close();
}
} catch (SocketTimeoutException ste) {
ste.printStackTrace();
client.close();
}
}
你能提供更多的代码吗?我想看看你接受与serversocketI的连接的部分。我更新了我的代码,几乎包含了所有内容,请看一看。