为什么这个套接字程序不传输数据?

时间:2011-05-20 21:32:26

标签: java sockets

我正在编写我的第一个socket项目,但我遇到了问题。当客户端向服务器发送字符串时,服务器无法获取此消息。

public class ClientActivity {

    public static final String serverIP = "127.0.0.1";
        private Socket clientSocket = null;
        private static BufferedOutputStream out = null;

    public static void main(String[] args) throws IOException {
        ClientActivity me = new ClientActivity();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        out.write("Some string");
    }

    public ClientActivity() throws UnknownHostException, IOException {
           clientSocket = new Socket(serverIP, serverPort);
           out = new BufferedOutputStream(clientSocket.getOutputStream());
    }
}

这是服务器的代码:

public class DataTransferServer {

    private ServerSocket serverSocket;
    private ArrayList<DataReaderThread> workingThreads;
    private Boolean isListening;
    private Thread listener;

    public static void main(String[] args) throws IOException {
        new DataTransferServer(IProtocolConstants.SERVER_PORT).startServer(); // FIXME
    }

    public DataTransferServer (int port) throws IOException {
        System.out.println("Launch");
        serverSocket = new ServerSocket(port);
        workingThreads = new ArrayList<DataReaderThread>();
        isListening = true;
        listener = new ConnectionListener();
    }

    public void startServer() throws IOException {
        listener.start();
    }

    private class ConnectionListener extends Thread {
        @Override
        public void run() {
            DataReaderThread newThread  = null;
            while (isListening) {
                try {
                    newThread = new DataReaderThread(serverSocket.accept(), DataTransferServer.this);
                    newThread.start();
                    workingThreads.add(newThread);
                    System.out.println("! thread started");
                } catch (IOException e) {
                    e.printStackTrace(); // FIXME
                }
            }
            if (newThread != null) {
                newThread.interrupt();
                newThread = null;
            }
        }
    }


}

这是听众:

public class DataReaderThread extends Thread {
    private Socket socket = null;
    private BufferedInputStream in = null;
    private byte[] stuffBytes = null;

    public DataReaderThread(Socket socket) throws IOException {
        super("DataReaderThread");
        this.socket = socket;
        in = new BufferedInputStream(socket.getInputStream());
stuffBytes = new byte[10];
    }

    public void run() {
        try {
            while (in.read(stuffBytes, 0, stuffBytes.length) != -1) {
System.out.println("Received data:" + new String(stuffBytes));
            }
            in.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Socket getSocket() {
        return socket;
    }

2 个答案:

答案 0 :(得分:3)

我想BufferedOutputStream out在缓冲区已满之前不会发送TCP数据包。

尝试在flush之后调用write立即发送数据:

out.write("Some string");
out.flush();

您也可以考虑使用PrintWriter类,它具有autoflush机制。

答案 1 :(得分:2)

-1在发布之前编译代码......

public class ClientActivity {

    public void write(String data) {
       out.write(data.getBytes())
       out.flush()
    }

    public static final String serverIP = "127.0.0.1";
        private Socket clientSocket = null;
        private BufferedOutputStream out = null;

    public static void main(String[] args) throws IOException {
        ClientActivity me = new ClientActivity();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        me.write("Some string");
    }

    public ClientActivity() throws UnknownHostException, IOException {
           clientSocket = new Socket(serverIP, serverPort);
           out = new BufferedOutputStream(clientSocket.getOutputStream());
    }
}