Server:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;public class DataSyncServer{ private ServerSocket serverSocket; public DataSyncServer() throws IOException {
serverSocket = new ServerSocket(8088);
} public void start() throws IOException {
while(true){
Socket socket=serverSocket.accept();
Thread handler=new Handler(socket);
handler.start();
}
}}
class Handler extends Thread{

private Socket socket;

Handler(Socket socket){
this.socket=socket;
}

public void run(){
try {
BufferedReader br=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuffer sb=new StringBuffer();
String line="";
while((line=br.readLine())!=null)
sb.append(line);
br.close();
System.out.println(sb.toString());
OutputStreamWriter osw=
new OutputStreamWriter(socket.getOutputStream());
osw.write("ok");
osw.flush();
osw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}Client:
public void testSocketClient()
{
try {
BufferedReader br=new BufferedReader(new FileReader("demo.xml"));
StringBuffer sb=new StringBuffer();
String line=null;
while((line=br.readLine())!=null){
sb.append(line);
}

Socket socket=new Socket("192.168.10.121",8088);

OutputStreamWriter osw=
new OutputStreamWriter(socket.getOutputStream());
osw.write(sb.toString());
osw.flush();
osw.close();

BufferedReader sbr=
new BufferedReader(new InputStreamReader(socket.getInputStream()));
sb=null;
sb=new StringBuffer();
while((line=sbr.readLine())!=null){
sb.append(line);
}

socket.close();

System.out.println(sb.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}总是出现 socket is closed的异常

解决方案 »

  1.   

    试试
    public void start() throws IOException {
    while(true){
    Socket socket=serverSocket.accept();
    Thread handler=new Handler(socket);
    handler.start();
    }
    socket.close();//关闭
    }
    public void run(){
    try {
    BufferedReader br=
    new BufferedReader(new InputStreamReader(socket.getInputStream()));
    StringBuffer sb=new StringBuffer();
    String line="";
    while((line=br.readLine())!=null)
    sb.append(line);
    br.close();
    System.out.println(sb.toString());
    OutputStreamWriter osw=
    new OutputStreamWriter(socket.getOutputStream());
    osw.write("ok");
    osw.flush();
    osw.close();
    //socket.close(); //去掉
    } catch (IOException e) {
    e.printStackTrace();
    }
      

  2.   

    OutputStreamWriter osw= 
    new OutputStreamWriter(socket.getOutputStream()); 
    osw.write(sb.toString()); 
    osw.flush(); 
    // osw.close();  你输出了,怎么能字节关闭呢?
      

  3.   

    LZ应该把Socket socket = new Socket("192.168.1.33", 8088);
    的声明放在方法的前面.
    让BufferedReader对象放在socket对象后面
      

  4.   

    java2000_net 大哥
    我把注释了,就诶过server就收不到消息了
      

  5.   

    osw.close(); 放最后,或者注释掉.
      

  6.   

    注释以后 server收不到消息了
      

  7.   

    楼主没有搞清楚 Socket 通讯的原理。发送内容时,两边需要约定一个结束符,否则接收端就会无休止的等待。
    下面是我改写的,实际运行通过(下面的代码中 import 部分省去了)。public class Server {    private ServerSocket serverSocket;    public Server() throws IOException {
            serverSocket = new ServerSocket(8088);
        }    public void start() throws IOException {
            while (true) {
                Socket socket = serverSocket.accept();
                Thread handler = new Handler(socket);
                System.out.println("服务端接受到连接...");
                handler.start();
            }
        }    public static void main(String[] args) throws Exception {
            new Server().start();
        }
    }class Handler extends Thread {    private Socket socket;    Handler(Socket socket) {
            this.socket = socket;
        }    public void run() {
            try {
                readContent();
                System.out.println("接收完毕。");
                sendResponse();
                System.out.println("发送回应。");
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }    /**
         * 向客户端发送回应
         *
         * @throws IOException 如果发送失败
         */
        private void sendResponse() throws IOException {
            OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
            osw.write("ok");
            osw.flush();
            osw.close();
        }    /**
         * 读取客户端传输过来的内容。内容以“__END__”结束。
         *
         * @throws IOException 如果读取失败
         */
        private void readContent() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while (!(line = br.readLine()).equals("__END__")) {
                System.out.println(line);
            }
        }}
    ///////////////////////////////////////////////public class Client {    public static void main(String[] args) {
            try {
                String content = readFile();
                Socket socket = new Socket("127.0.0.1", 8088);
                sendContent(socket, content);
                readResponse(socket);
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }    }    /**
         * 通过 Socket 端口读取服务器端的回应
         *
         * @param socket 读取的端口
         *
         * @throws IOException 如果读取失败
         */
        private static void readResponse(Socket socket) throws IOException {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
            StringBuffer buffer = new StringBuffer();
            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }
            System.out.println(buffer.toString());
        }    /**
         * 将指定的内容通过指定的端口发送出去
         *
         * @param socket  指定端口
         * @param content 要发送的内容
         *
         * @throws IOException 如果发送失败
         */
        private static void sendContent(Socket socket, String content) throws IOException {
            OutputStreamWriter osw =
                    new OutputStreamWriter(socket.getOutputStream());
            osw.write(content + "__END__\n");
            osw.flush();
        }    /**
         * 读取文件内容
         *
         * @return 文件内容
         *
         * @throws IOException 如果读取文件失败
         */
        private static String readFile() throws IOException {
            BufferedReader br = new BufferedReader(new FileReader("demo.xml"));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
            String content = sb.toString();
            br.close();
            return content;
        }
    }