这是我正在做的一个简单的多线程聊天程序。除输出格式之外,一切正常。在客户端连接到服务器之后,聊天就会启动。但是在这两个控制台上,该消息都以" 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) { }
}
}
此外,对此代码的任何建议或优化都被大大接受。
答案 0 :(得分:0)
小提示:删除活动等待:
while( write.isAlive() || read.isAlive() ) ;
这使CPU运行无用。最好在这里使用使用阻塞的连接:
write.join;
read.join;