写一个简单的例子测试,Socket服务器端,与客户端收发数据的功能,但出现Bug了,求助:
服务器端:
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;/**
 * Socket服务器端,a simple example
 */
public class ServerOne {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        while (true) {
            try {
                // 服务器端SeverSocket
                serverSocket = new ServerSocket(8080, 0, InetAddress.getLocalHost());                // 阻塞直到有请求接入
                Socket accept = serverSocket.accept();                // 得到输入流
                InputStream inputStream = accept.getInputStream();                // 输出请求的字符
                BufferedInputStream inBuffer = new BufferedInputStream(inputStream);
                for (int c; (c = inBuffer.read()) != -1;) {
                    System.out.print((char) c);
                }                // 得到输出流
                OutputStream outputStream = accept.getOutputStream();
                OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
                BufferedWriter writer = new BufferedWriter(streamWriter);
                DateFormat df = new SimpleDateFormat("yyyy-mm-dd hh:MM:ss");
                String str = "当前时间是:" + df.format(System.currentTimeMillis());
                
                // 输出日期,时间,并刷新输出缓冲区
                writer.write(str);
                writer.flush();            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (IOException ignore) {
                    }
                }
            }
        }
    }
}
客户端:import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/**
 * Socket客户端
 */
public class ClientOne {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket(InetAddress.getLocalHost(), 8080);            // 得到输出流
            OutputStream outputStream = socket.getOutputStream();            // 输出
            OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
            BufferedWriter bfWriter = new BufferedWriter(streamWriter);
            bfWriter.write("Hello Boy!");
            // 刷新缓冲区
            bfWriter.flush();            // 得到输入流,并输出
            InputStream inputStream = socket.getInputStream();            InputStreamReader stReader = new InputStreamReader(inputStream);
            for (int c; (c = stReader.read()) != -1;) {
                System.out.print((char) c);
            }
            System.out.println("ceshi");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException ignore) {
                }
            }
        }
    }
}ServerOne先启动,ClientOne后启动
result: 
       ServerOne输出 Hello Boy!
       Client没输出,一直阻塞
求助? why? socket

解决方案 »

  1.   

    问题出在for (int c; (c = inBuffer.read()) != -1;) {
                        System.out.print((char) c);
                    }你的Server端没有读到-1,Client没有close,所有阻塞在这了
      

  2.   

    服务器端,读取到客户段的输入请求了,客户端没有读取到服务器段的输出。Client端,close了啊。
      

  3.   

    服务器端:package com.socket;import java.io.BufferedInputStream;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;public class ServerOne {

    public static void main(String[] args) {
    ServerSocket serverSocket = null;
    try {
    // 服务器端SeverSocket
    serverSocket = new ServerSocket(8080, 0, InetAddress.getLocalHost());

    /**
     * 首先要明白一个端口号好IP确定一个服务器端,那么你把while写在上面那句代码前面肯定不行,一定会报端口被占用的。要想连接多个客户端,while只能加在这里,
     * while里面的代码要修改,要将accept返回的输入输出流保存到map中,可以用客户端的ip作为key。
     */
    //while(true){

    // 阻塞直到有请求接入
    Socket accept = serverSocket.accept();
    // 得到输入流
    InputStream inputStream = accept.getInputStream();
    // 得到输出流
    OutputStream outputStream = accept.getOutputStream();

    new Thread(new ServerMessageReader(inputStream)).start();

    OutputStreamWriter streamWriter = new OutputStreamWriter(
    outputStream);
    BufferedWriter writer = new BufferedWriter(streamWriter);
    DateFormat df = new SimpleDateFormat("yyyy-mm-dd hh:MM:ss");
    String str = "当前时间是:" + df.format(System.currentTimeMillis()); // 输出日期,时间,并刷新输出缓冲区
    writer.write(str);
    writer.flush();
    //}while结束位置
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (serverSocket != null) {
    try {
    serverSocket.close();
    } catch (IOException ignore) {
    }
    }
    }
    }}/**
     * 当流通道建立成功以后将一直连接,不会中断,如果对方没有输出东西,那么接受方就会一直等待。
     * @author johon
     *
     */
    class ServerMessageReader implements Runnable {

    private InputStream inputStream;

    public ServerMessageReader(InputStream inputStream) {
    this.inputStream = inputStream;
    } @Override
    public void run() {
    // 输出请求的字符
    BufferedInputStream inBuffer = new BufferedInputStream(inputStream);
    try {
    for (int c; (c = inBuffer.read()) != -1;) {
    System.out.print((char) c);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    客户端:package com.socket;import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;public class ClientOne { /**
     * @param args
     */
    public static void main(String[] args) {
    Socket socket = null;
            try {
                socket = new Socket(InetAddress.getLocalHost(), 8080);
     
                // 得到输出流
                OutputStream outputStream = socket.getOutputStream();
     
                // 输出
                OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
                BufferedWriter bfWriter = new BufferedWriter(streamWriter);
                bfWriter.write("Hello Boy!");
                // 刷新缓冲区
                bfWriter.flush();
     
                // 得到输入流,并输出
                InputStream inputStream = socket.getInputStream();
     
                InputStreamReader stReader = new InputStreamReader(inputStream);
                for (int c; (c = stReader.read()) != -1;) {
                    System.out.print((char) c);
                }
                System.out.println("ceshi");
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException ignore) {
                    }
                }
            }
    }}
      

  4.   

    服务器端,读取到客户段的输入请求了,客户端没有读取到服务器段的输出。Client端,close了啊。
    呵呵,你Close在最后,没有这种用法,你可以测试一下,阻塞在服务器端
      

  5.   

    服务端要等客户端关闭连接才能解开阻塞,跳出循环
    客户端要等到服端输出后才能关闭连接
    服务端无法走出for,客户端收不到服务端数据一直阻塞在那里,dead lock了