套接字编程 - 客户端 - 服务器代码无法正常工作

时间:2014-04-05 16:55:31

标签: java sockets client

我在java中找到了一个简单程序的例子,它假设可以在Java中实现客户端 - 服务器示例。

客户代码:

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

public class ClientDemo {

    public static void main(String[] args) {

        try {
            Socket sock = new Socket ("127.0.0.1", 4321);

            DataInputStream input = new DataInputStream(sock.getInputStream());

            boolean more_data = true;

            while (more_data) {

                String line = input.readLine();

                if(line==null) {
                    more_data = false;
                }
                else {
                    System.out.println(line);
                }            
            }
        }
        catch (IOException e) {
        }    
    }    
}

服务器代码:

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

public class SimpleServer
{

public static void main(String[] args)
{
    try
{
        ServerSocket server = new ServerSocket (4321);            
        Socket sock = server.accept();
        DataInputStream inp = new DataInputStream (sock.getInputStream());
        PrintStream out = new PrintStream (sock.getOutputStream());
        output.println("server message");
        output.println("QUIT to Quit");

        boolean more_data = true;

            while (more_data)
    {
                String line = inp.readLine();

                if(line==null)
        {
                    more_data = false;
                }
                else
                {
                    output.println("Server:" +line+"\n");
                    if(line.trim().equals("Exit")
        {
                        more_data = false;
                    }
                }            
            }
            sock.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }    
    }    
}

首先运行服务器然后运行客户端时,我收到欢迎消息,但是当在客户端控制台中输入文本然后按回车键时,没有任何反应。

我尝试在BufferedInputStream中替换DataInputStream,就像它说readline被弃用的文档一样,但是同样的行为,加上我试图用nextLine更改为scanner对象,同样的行为也是如此。

您的意见将非常受欢迎。

2 个答案:

答案 0 :(得分:0)

这是因为您的客户甚至没有尝试从控制台读取。它只从套接字读取。

答案 1 :(得分:0)

试试这个客户端。并看看你的服务器。它停在Exit而不是QUIT

更新

我已经更改了代码,现在我必须更改我的名字; - )

客户端非常非常简单,没有人应该使用它。客户端必须知道服务器将发送多少行。 如果没有其他线程,就无法等待未知的线数。

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

public class ClientDemo {

    public static void main(String[] args) {

        try {
            Socket sock = new Socket("127.0.0.1", 4321);
            // Build a Buffered Reader - it is easier to read complete line
            BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            // After connecting we read the first 2 line
            // We know that the server send 2 lines
            System.out.println(input.readLine());
            System.out.println(input.readLine());
            // Wen must have a reader for our inputs
            InputStreamReader consoleReader = new InputStreamReader(System.in);
            BufferedReader in = new BufferedReader(consoleReader);
            while (true) {
                // read one line from the console
                String inline = in.readLine();
                inline += "\n";
                // send the line to the server
                sock.getOutputStream().write(inline.getBytes());
                sock.getOutputStream().flush();
                // Wait for server response - we know that we get 2 lines
                for (int i = 0; i < 2; i++) {
                    String response = input.readLine();
                    if (response == null || inline.equals("Exit")) {
                        break;
                    } else {
                        System.out.println(response);
                    }

                }
            }
        } catch (IOException e) {
        }
    }
}