1

客户端成功收到来自服务器端的一条消息后,我收到了错误消息。错误消息是:线程“main”中的异常 java.net.SocketException:软件导致连接中止:recv 失败

似乎在客户端类中,line = inFromserver.readLine();不会收到来自服务器的任何消息,使其变为“空”。但我不知道为什么。有人可以帮我吗?

服务器类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;


public class ConcurrentServer {
   public static void main(String args[]) throws IOException
   {
    int portNumber = 20020;
    ServerSocket serverSocket = new ServerSocket(portNumber);
    while ( true ) {
        new ServerConnection(serverSocket.accept()).start();
    }

}

}

class ServerConnection extends Thread
{
    Socket clientSocket;  
    PrintWriter outToClient;

   ServerConnection (Socket clientSocket) throws SocketException
   {
    this.clientSocket = clientSocket;
    setPriority(NORM_PRIORITY - 1);     
}   


public void run()
{
    BufferedReader inFromClient;
    try{
        inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        OutputStream outToClient = clientSocket.getOutputStream();
        PrintWriter printOutPut = new PrintWriter(new OutputStreamWriter(outToClient),true);
        String request= inFromClient.readLine();
        if(request !=null)
        {
            if(!request.equalsIgnoreCase("finished"))
            {
                printOutPut.write("Receving data");
            }
            else
            {
                printOutPut.write("file received");
            }
        }

        }catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
        }


        try
        {   
            clientSocket.close();
        }catch (IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            }
    }
}

客户类

import java.io.*;
import java.net.*;
import java.util.concurrent.TimeUnit;

public class client{

public static void main(String[] args) throws Exception{

    final int PORT=20020;
    String serverHostname = new String("127.0.0.1");

    Socket socket;
    PrintWriter outToServer;
    BufferedReader inFromServer;
    BufferedReader inFromUser;
    byte[] dataToTransfer;
    String line;
    int counter=0;
    int i=0;

    socket = new Socket(serverHostname, PORT);
    outToServer = new PrintWriter(socket.getOutputStream(),true);
    inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    inFromUser = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Simulation of file transferring");
    System.out.println("Enter the file size you want to transfer (Max Size 50MB)");

    int userInput = Integer.parseInt(inFromUser.readLine());

    System.out.println("Transferring start");

    boolean connection = true;
    while(connection)
    {

        //set transfer rate at 1MB/s
        dataToTransfer = new byte[1000000];

        Thread.sleep(1000);

        if(i<userInput)
        {
            outToServer.println(dataToTransfer);
            counter++;
            System.out.println(counter + "MB file has been transferred");
        }
        else
        {
            outToServer.println("Finished");
        }


        line = inFromServer.readLine();
        System.out.println(line);
        if(!line.equalsIgnoreCase("file received"))
        {

        }
        else
        {
            System.out.println("Transfer completed");
            break;
        }
        i++;
    }

    outToServer.close();
    inFromServer.close();
    inFromUser.close();
    socket.close();
}

}
4

1 回答 1

0

您正在从客户端向服务器发送字节数组并在服务器端读取字符串。

在你的字节数组中插入一些东西,然后将你的字节数组转换为字符串

String str = new String(dataToTransfer,int offset, 1000000);

然后写:

outToServer.println(str);

于 2013-09-24T09:10:21.313 回答