Java:安慰多线程聊天程序

时间:2014-08-12 11:08:01

标签: java multithreading

这是我正在做的一个简单的多线程聊天程序。除输出格式之外,一切正常。在客户端连接到服务器之后,聊天就会启动。但是在这两个控制台上,该消息都以" Server:"为前缀。而不是"服务器:"对于客户端控制台和"客户:" for Server console(根据代码)

服务器代码

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

class Server
{
    public static void main(String args[]) throws Exception
    {
        ServerSocket ss = new ServerSocket(1234);
        Socket comsocket = ss.accept();

        BufferedReader fromClientConsole = new BufferedReader(new
                InputStreamReader(comsocket.getInputStream()));
        DataOutputStream outStream = new DataOutputStream(comsocket.getOutputStream());
        BufferedReader fromThisConsole = new BufferedReader(new
                InputStreamReader(System.in));

        System.out.println("Starting Chat session... Type 'endchat' to end the chat");

        Thread read = new Thread(new Read(fromClientConsole));
        Thread write = new Thread(new Write(fromThisConsole, outStream));


        read.start();
        write.start();

        while( read.isAlive() || write.isAlive() ) ;

        comsocket.close();
        ss.close();
    }
}

class Read implements Runnable
{
    BufferedReader fromClientConsole = null;
    String message = "";
    Read(BufferedReader fromClientConsole)
    {
        this.fromClientConsole = fromClientConsole;
    }

    public void run()
    {
        try{
            while(true)
            {
                message = fromClientConsole.readLine();
                System.out.println(message);
                if(message.equalsIgnoreCase("endchat")) break;
            }
        }

        catch(IOException e) { }
    }
}


class Write implements Runnable
{
    BufferedReader fromThisConsole=null;
    DataOutputStream outStream = null;
    String message = " ";
    Write(BufferedReader fromThisConsole, DataOutputStream outStream)
    {
        this.fromThisConsole = fromThisConsole;
        this.outStream = outStream;
    }

    public void run()
    {
        try {
            while(true)
            {
                message = fromThisConsole.readLine();
                message = "Server: "+ message;
                outStream.writeBytes(message + "\n");
                if(message.equalsIgnoreCase("endchat")) break;
            }
        }

        catch(IOException e) { }
    }
}

客户代码

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


class Client
{
    public static void main(String args[]) throws Exception
    {
        Socket connection_socket = new Socket("127.0.0.1", 1234);
        DataOutputStream outStream = new
                DataOutputStream(connection_socket.getOutputStream());
        BufferedReader fromThisConsole = new BufferedReader(new
                InputStreamReader(System.in));
        BufferedReader fromServerConsole = new BufferedReader(new
                InputStreamReader(connection_socket.getInputStream()));

        System.out.println("Starting Chat session... Type 'endchat' to end the chat");

        Thread write = new Thread(new Write(fromThisConsole, outStream));
        Thread read = new Thread(new Read(fromServerConsole));

        write.start();
        read.start();

        while( write.isAlive() || read.isAlive() ) ;

        connection_socket.close();
    }
}

class Read implements Runnable
{
    BufferedReader fromServerConsole = null;
    String message = " ";
    Read(BufferedReader fromServerConsole)
    {
        this.fromServerConsole = fromServerConsole;
    }

    public void run()
    {
        try{
            while(true)
            {
                message = fromServerConsole.readLine();
                System.out.println(message);
                if(message.equalsIgnoreCase("endchat")) break;
            }
        }

        catch(IOException e) {
        }
    }
}


class Write implements Runnable
{
    BufferedReader fromThisConsole = null;
    DataOutputStream outStream = null;
    String message = " ";
    Write(BufferedReader fromThisConsole, DataOutputStream outStream)
    {
        this.fromThisConsole = fromThisConsole;
        this.outStream = outStream;
    }

    public void run()
    {
        try{
            while(true)
            {
                message = fromThisConsole.readLine();
                message = "Client: " + message;
                outStream.writeBytes(message + "\n");
                if(message.equalsIgnoreCase("endchat")) break;
            }
        }
        catch(IOException e) { }
    }
} 

此外,对此代码的任何建议或优化都被大大接受。

1 个答案:

答案 0 :(得分:0)

小提示:删除活动等待:

while( write.isAlive() || read.isAlive() ) ;

这使CPU运行无用。最好在这里使用使用阻塞的连接:

write.join;
read.join;