繁体   English   中英

Java TCP套接字无法将文件发送到服务器端

[英]java tcp socket can't send file to server side

我是java套接字编程的新手,该程序允许TCP服务器具有可同时运行的多线程。 我尝试将txt文件从一个客户端(有另一个客户端将同时发送文件)发送到服务器端,并要求服务器将“确定”状态消息发送回客户端。 但是似乎服务器无法从客户端接收任何文件,而奇怪的是, 如果我在客户端类中删除receiveFile()方法,则服务器能够从客户端接收文件。 有人可以帮我吗?

服务器类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
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;  

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


public void run()
{
    try{
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        OutputStream outToClient = clientSocket.getOutputStream();

        PrintWriter printOutPut = new PrintWriter(outToClient,true);

        while(inFromClient.ready())
        {
            String request = inFromClient.readLine();
            System.out.println(request);
            System.out.println("test");
        }   
        printOutPut.write("HTTP/1.1 200 OK\nConnection: close\n\n");
        printOutPut.write("<b> Hello sends from Server");


        printOutPut.flush();
        printOutPut.close();

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

客户类

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


 public class SmallFileClient {

static String file="test.txt";
static PrintWriter outToServer;
static Socket socket;
public static void main(String[] args) throws IOException
{
    final int PORT=20020;
    String serverHostname = new String("127.0.0.1");

    socket = new Socket(serverHostname, PORT);
    outToServer = new PrintWriter(socket.getOutputStream(),true);

    sendFile();
    receiveFile();

    outToServer.flush();
    outToServer.close();
    socket.close();

}
//read file and send file to server
public static void sendFile() throws IOException
{
    BufferedReader br=new BufferedReader(new FileReader(file));
    try
    {
        String line = br.readLine();
        while(line!=null)
        {
            //send line to server
            outToServer.write(line);
            line=br.readLine();
        }

    }catch (Exception e){System.out.println("!!!!");}

    br.close();
}
//get reply from server and print it out
public static void receiveFile() throws IOException
{
    BufferedReader brComingFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    try
    {
        String inline = brComingFromServer.readLine();
        while(inline!=null)
        {
            System.out.println(inline);
            inline = brComingFromServer.readLine();
        }
    }catch (Exception e){}
}
}

摆脱ready()测试。 更改为:

while ((line = in.readLine()) != null)
{
    // ...
}

readLine()将阻塞,直到有可用数据为止。 目前,一旦没有可供读取的数据而没有阻塞 ,您将停止读取循环 换句话说,您假设`!ready()!! 表示流结束。 它没有:请参阅Javadoc。

暂无
暂无

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

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