各位大神们好,小弟最近在学socket,遍了一个server和client之间的聊天程序,可以正常实现两者之间的双向聊天,就是每个端都可以接受信息和发送信息,但是一个小问题,不是同步的,我先解释下一下,我觉得是逻辑问题,贴段server里面的代码:
// BufferedReader br  = getReader(socket); 
// PrintWriter pw = getWriter(socket);
// BufferedReader osin = new BufferedReader(new InputStreamReader(System.in));
// System.out.println("Client: "+br.readLine());
// String osline = osin.readLine();
// while(!osline.equals("stop"))
// {
// pw.println(osline);
// pw.flush();
//
// System.out.println("Client:" +br.readLine());
// osline = osin.readLine();
// }
前面都没有什么问题,第一行和第二行getreader和getwriter我在前面封装成函数了,不是问题,关键在while里面
就是System.out.println("Client:" +br.readLine());开始,这句,我正常输入了client所输入的信息,这时候我必须执行下面一句如果,这时候我server没有输入信息,这个函数就阻塞了,不往下执行,所以这时候client再怎么输入,server端没有输出显示。要想双向聊天必须按着while里面的逻辑,我client先发一句,然后server收一句然后显示,然后server必须会回一句,如果不回,server阻塞,client再输入也没用。这时候比如说client已经连续输入4句话了,server只显示第一句,要想显示下面的,这时候,server输入一句,然后的确会刷新一句client的输入。但是这个不是聊天里面真正的同步聊天。所以想请问各位大神如何解决这个问题。去网上搜了下,没怎么太找到。如果大神们知道的话恳请把逻辑还有代码说详细一点,谢谢。
对了,自己尝试把每个端的read和write功能分开,写成两个不同线程,但是可能是多线程不太熟悉,老是报错,说socket closed  主要代码如下:
class Read extends Thread
{ private BufferedReader dis;
public Read(BufferedReader dis)
{
this.dis = dis;
}
@Override
public void run()
{
String info;
// TODO Auto-generated method stub
try
{
while(true)
{
info = dis.readLine();
System.out.println("Client: "+info);

}

}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
class Write extends Thread
{ private DataOutputStream dos;
private BufferedReader br;

public Write(DataOutputStream dos,BufferedReader br)
{
this.dos = dos;
this.br = br;
}
@Override
public void run()
{
// TODO Auto-generated method stub
String info;
try
{
while(true)
{
info = br.readLine();
dos.writeUTF(info);
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
server里面就是
BufferedReader dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream dos =  new DataOutputStream(socket.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
new Read(dis).start();
new Write(dos,br).start();
错误提示如下
java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at MutiServeur.Read.run(Handler.java:87)
Exception in thread "Thread-1" java.lang.NullPointerException
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:330)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:306)
at MutiServeur.Write.run(Handler.java:133)