简体   繁体   中英

TCP socket communication failed after the first trial

I have received error message after the client side successful received one message from server side. The error message is: Exception in thread "main" java.net.SocketException: Software caused connection abort: recv failed

It seems in client class, line = inFromserver.readLine(); would not receive any message from server, making it become "null". But I dont know why. Could somebody please help me?

Server class

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();
            }
    }
}

client class

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();
}

}

You are sending byte array from client to server and reading string on server side.

Insert somthing in your byte array and then Convert your byte array into String

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

then write:

outToServer.println(str);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM