0

如果分开

客户端---发送消息到---> 服务器:工作正常!

如果分开

服务器---发送消息到--->客户端:工作正常!

但是当两者在一起时:

客户端---发送消息到--->服务器
服务器---发送消息到--->客户端

没有任何工作!

这是服务器端:

import java.io.*;
import java.net.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class MyServer
{  
    private final static int port = 8000; 
    private static String hostname = "";
    private static String hostIP ="";
    public static void main(String[] args )
    {  
        ServerSocket serverSocket=null;
        try {
            // get host information
            hostname = InetAddress.getLocalHost().getHostName();
            hostIP = InetAddress.getLocalHost().getHostAddress();
            // display server information
            System.out.println("MyServer started on "+hostname+" with IP: "+hostIP + " on the port number: " + port);
            serverSocket = new ServerSocket(port);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        while(true)
        {   
            ClientWorker w;
            try
            {   
                w = new ClientWorker(serverSocket.accept());
                Thread t = new Thread(w);
                t.start();
            }
            catch(IOException e)
            {
                e.printStackTrace();
                break;
            }   
        }
    }
}   
class ClientWorker implements Runnable
{
    Socket incoming;
    public ClientWorker(Socket incoming)
    {
        this.incoming = incoming;
    }
    public void run()
    {
        String request = null;
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            request = in.readLine();
            System.out.println("request =" + request);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PrintWriter out = null;
        try {
            out = new PrintWriter(incoming.getOutputStream(),true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.println("The command is not readable");

    }

}

这是客户端:

import java.io.*;
import java.net.*;
public class MyClient2
{
    public static void main(String[] args)
    {
        String answer = null;
        if (args.length != 1){
            System.out.println("Usage: MyClient serverHostname");
            System.exit(0);
        }
        try
        {
            Socket socket = new Socket (args[0], 8000);
            PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
            out.print("TIME");
            System.out.println("Request has been send");
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
            answer = in.readLine();         
            System.out.println("The answer is:  "+answer);
            in.close();
            out.close();
            socket.close();
        }
        catch (Exception e)
        {
            System.out.println("Make sure the server is running and try again");
        }
    }
}

请看一下,我很感激你的意见。干杯

4

1 回答 1

5

您正在使用readLine阻塞直到读取换行符或关闭流的方法。您既不发送换行符也不关闭流(直到您期望收到响应之后)。

尝试更改out.print("TIME");out.println("TIME");.

此外,避免使用 PrintWriter,因为它隐藏了发生的任何 IOExceptions,您必须手动检查。您的异常处理不是很好。当发生 IOException 时,您可能应该终止线程(而不是盲目地继续),因为您无法从错误中恢复。

此外,您ClientWorker不会自行清理 - 即。关闭流和套接字。

于 2012-10-14T04:28:17.310 回答