读写服务器

时间:2012-10-31 06:11:19

标签: java sockets client printwriter

目标:将数据发送到服务器并让服务器返回一些内容并打印服务器发回的内容

问题:如果我关闭流出,那么它会将数据发送到服务器,但我的输入流将无法工作,我无法收到服务器试图给我的内容。如果我使用flush()将数据发送到服务器,则服务器永远不会接收数据。我已经坚持了3个小时。你如何同时读写。

Client.java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

class Client {
    public static void main(String args[]) {
        String data = "head";
        try {
            Socket skt = new Socket("server", 5050);
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            out.print(data);
            out.close();

            System.out.println("Sent data");
            while (!in.ready()) {
            }

            String input = in.readLine();
            System.out.println(input);

            out.close();
            in.close();
            skt.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n" +e.toString());
        }
    }
}

Server.java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.PrintWriter;

class Server {
    public static void main(String args[]) {
        String data;
        String input;
        try {
            ServerSocket srvr = new ServerSocket(5050);
            Socket skt = srvr.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    skt.getInputStream()));
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);

            // /////Waits for message from client/////////
            while (!in.ready()) {
            }
            // ///////////////////////////////////////////

            input = in.readLine(); // Read the message
            System.out.println("Received String input: " + input);
            // Send output to client
            System.out.println("After output");
            if (input.equals("head"))
                data = "haha";
            else
                data = "Wtf did you send me";
            Thread.sleep(2000);
            out.print(data);
            // ///////////////////

            System.out.println("Sent data: " + data);
            in.close();
            out.close();
            skt.close();
            srvr.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n");
        }

    }
}

1 个答案:

答案 0 :(得分:2)

在您的客户中,您有:

out.print(data);
out.close();

在你的服务器中你有:

input = in.readLine();

客户端发送消息没有换行符号 - 这就是in.ready() true 的原因。更重要的是 - 它关闭 PrintWriter 而不是刷新(你也在程序结束时关闭流)。如果您将这些行更改为:

out.println(data); // sends message with new line character
out.flush();       // unnecessary

客户端发送消息。同样的事情是当服务器发送消息时 - 您使用print而不是println但是客户端使用readLine读取,直到新行字符为止,或者更准确(BufferedReader|readLine() ):

  

读取一行文字。一条线被认为是由换行符('\ n'),回车符('\ r')或回车符后面的任何一个终止。

还有一件事 - 您使用"server"主机名连接到服务器。对于我的测试,我将其更改为"localhost"。也许还有其他错误?