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

标签 java socket.io

客户端成功接收到来自服务器端的一条消息后,我收到了错误消息。错误消息是:线程“main”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 = new String(dataToTransfer,int offset, 1000000);

然后写:

outToServer.println(str);

关于java - 第一次尝试后 TCP 套接字通信失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18934427/

相关文章:

Java Socket IO 不发送到 Node.js,但可以连接和接收

java - unix "which java"相当于 Windows 上的命令?

匿名对象方法的Javadoc

java - 在 Java 中使用正则表达式模式

java - (this.static 变量) vs (静态变量)

javascript - Socket.io 仅在两个客户端之间同步

java - 设置 JFrame 背景透明使 PopupMenu 空白

javascript - 从服务器向 Socket.IO 发送事件不工作

node.js - 为什么 Socket.io 在 Windows 上很慢?

javascript - 自动更新套接字连接数据?套接字.io