繁体   English   中英

第一次尝试后,TCP套接字通信失败

[英]TCP socket communication failed after the first trial

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

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

服务器类

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

}

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

在字节数组中插入东西,然后将字节数组转换为String

字符串str =新的String(dataToTransfer,int offset,1000000);

然后写:

outToServer.println(str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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