0

我是java socket 编程的新手,这个程序允许 TCP 服务器有一个可以并发运行的多线程。我尝试将 txt 文件从一个客户端(有另一个客户端同时发送文件)发送到服务器端,并要求服务器将“ok”状态消息发送回客户端。但似乎服务器无法从客户端接收任何文件,奇怪的是如果我删除客户端类中的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){}
}
}
4

1 回答 1

0

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

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

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

于 2013-09-21T07:46:34.930 回答