lucia1112 2011-09-11 22:16 采纳率: 0%
浏览 273
已采纳

有关客户端与服务器端通信的问题

写了一段服务器端和客户端通信代码,实现以下功能:客户端将文件发送到服务器端,服务器端接收完文件后给客户端发送一个消息。
运行代码后出现以下问题不知如何神马原因:
客户端文件可以正确地传到服务器端,但是服务器端接收完文件后发送给客户端地确认消息,客户端收不到,报java.net.SocketException: Socket is closed的异常,请各位帮忙看看

客户端代码
package client;

import java.io.*;
import java.net.*;

public class ClientThread extends Thread{
private int hostPort=3000;
protected BufferedReader socketReader;
protected PrintWriter socketWriter;
private BufferedReader streamReader;

public ClientThread(){
    setUpConnection();

}

public void setUpConnection() 
{ 
try 
{ 

    Socket client = new Socket("127.0.0.1", hostPort); 
    //socketWriter = new PrintWriter(client.getOutputStream());
    InputStream inputFromSocket = client.getInputStream();
    streamReader = new BufferedReader(
            new InputStreamReader(inputFromSocket));
    handleConnection(client);
} catch (UnknownHostException e) { 
System.out.println("Error setting up socket connection: unknown host"); 
} catch (IOException e) { 
System.out.println("Error setting up socket connection: " + e); 
} 
} 



public void handleConnection(Socket client) {
    try {
        File file=new File("a.txt");
        FileReader fileReader = new FileReader(new File("a.txt"));
        BufferedReader bufferedFileReader = new BufferedReader(fileReader);
        PrintWriter streamWriter = new PrintWriter(
                client.getOutputStream());
        String line = null;
        while ((line = bufferedFileReader.readLine()) != null) {
            streamWriter.println(line);
        }
        fileReader.close();
        streamWriter.close();

        //////读取服务器收到文件后的返回内容
        String str=streamReader.readLine();
        while(str!=null){
            System.out.println(str);
        }


    } catch (Exception e) {
        System.out.println("Error handling a client: " + e);
    }
    } 

}

服务器端代码

import java.net.*;
import java.io.*;

public class ServerThread extends Thread{
private int listenPort = 3000;

public ServerThread(){
    acceptConnections();
}

public void acceptConnections() {
    try {
        ServerSocket server = new ServerSocket(listenPort);
        Socket incomingConnection = null;
        while (true) {
            incomingConnection = server.accept();
            handleConnection(incomingConnection);
        }
    } catch (BindException e) {
        System.out.println("Unable to bind to port " + listenPort);
    } catch (IOException e) {
        System.out.println("Unable to instantiate a ServerSocket on port: "
                + listenPort);
    }
}

public void handleConnection(Socket incomingConnection) {
    try {
        BufferedReader  socketReader = new BufferedReader( 
                new InputStreamReader(incomingConnection.getInputStream())); 

        String line = null;
        while ((line = socketReader.readLine()) != null) {
            //streamWriter.println(line);
            System.out.println(line);
        }
        socketReader.close();

        /////////接受完服务器发送的文件后给客户端
        OutputStream os=incomingConnection.getOutputStream();
        os.write("".getBytes());
    } catch (Exception e) {
        System.out.println("Error handling a client: " + e);
    }
}

}

  • 写回答

6条回答 默认 最新

  • rainbow702 2011-09-12 00:29
    关注

    给你修改了一下,可以正常运行:
    [code="java"]
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.BindException;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class ServerThread extends Thread {
    private int listenPort = 30000;

    public ServerThread() {
        acceptConnections();
    }
    
    public void acceptConnections() {
        try {
            ServerSocket server = new ServerSocket(listenPort);
            Socket incomingConnection = null;
            int i=1;
            while (true) {
                System.out.println("i= " + (i++));
                incomingConnection = server.accept();
                handleConnection(incomingConnection);
            }
        } catch (BindException e) {
            System.out.println("Unable to bind to port " + listenPort);
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Unable to instantiate a ServerSocket on port: "
                    + listenPort);
        }
    }
    
    public void handleConnection(Socket incomingConnection) {
        try {
            BufferedReader socketReader = new BufferedReader(
                    new InputStreamReader(incomingConnection.getInputStream()));
    
            String line = null;
            while (!(line = socketReader.readLine()).equals("xxx")) {
                // streamWriter.println(line);
                System.out.println(line);
            }
    

    // socketReader.close();

            // ///////接受完服务器发送的文件后给客户端
            OutputStream os = incomingConnection.getOutputStream();
            os.write("message arrivered\n".getBytes());
            os.write("\n".getBytes());
            os.flush();
            System.out.println("handleConnection() is over");
        } catch (Exception e) {
            System.out.println("Error handling a client: " + e);
        }
    }
    
    public static void main(String[] args) {
        new ServerThread().start();
    }
    

    }
    [/code]

    [code="java"]
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;

    public class ClientThread extends Thread{
    private int hostPort = 30000;
    protected BufferedReader socketReader;
    protected PrintWriter socketWriter;
    private BufferedReader streamReader;

    public ClientThread() {
        setUpConnection();
    }
    
    public void setUpConnection() {
        try {
    
            Socket client = new Socket("127.0.0.1", hostPort);
            // socketWriter = new PrintWriter(client.getOutputStream());
            InputStream inputFromSocket = client.getInputStream();
            streamReader = new BufferedReader(new InputStreamReader(
                    inputFromSocket));
            handleConnection(client);
        } catch (UnknownHostException e) {
            System.out
                    .println("Error setting up socket connection: unknown host");
        } catch (IOException e) {
            System.out.println("Error setting up socket connection: " + e);
        }
    }
    
    public void handleConnection(Socket client) {
        try {
            File file = new File("src/test.txt");
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedFileReader = new BufferedReader(fileReader);
            PrintWriter streamWriter = new PrintWriter(client.getOutputStream());
            String line = null;
            while ((line = bufferedFileReader.readLine()) != null) {
                streamWriter.println(line);
            }
            streamWriter.println("xxx");
            streamWriter.flush();
            fileReader.close();
            // 此处不能断,否则就断开了与服务器的 socket 连接
            // streamWriter.close();
            // ////读取服务器收到文件后的返回内容
            String str;
            while ((str = streamReader.readLine()) != null && !str.equals("")) {
                System.out.println(str);
            }
            System.out.println("client thread is over");
        } catch (Exception e) {
            System.out.println("Error handling a client: " + e);
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        new ClientThread().start();
    }
    

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?