package myfistsocket;/*一个作为Server*/
import java.io.*;
import java.net.*;public class MyServer
{
public static void main(String[] args) throws IOException
{
ServerSocket s = new ServerSocket(9999);
System.out.println("开始:" + s);
try
{
Socket socket = s.accept();
try
{
System.out.println("连接接受" + socket);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),
true);
while (true)
{
String str = in.readLine();
if (str.equals("q"))
{
break;
}
System.out.println("客户端回应说:" + str);
System.out.println("服务器现在可以输入 :");

BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
String input = new String();
input = is.readLine().trim(); out.println(input);
System.out.print("服务器说:");
out.flush(); }
}
finally
{
System.out.println("关闭....");
socket.close();
}
}
finally
{
s.close();
}
}
}-------------------------------------
package myfistsocket;/*一个作为Client*/
import java.io.*;
import java.net.*;public class MyClient
{
public static void main(String[] args) throws IOException
{
InetAddress addr = InetAddress.getByName("127.0.0.1");
System.out.println("地址=" + addr);
Socket socket = new Socket(addr, 9999);
try
{
System.out.println("socket=" + socket);
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
for (;;)
{
System.out.print("客户端说:");

String input = new String();
input = is.readLine().trim();

out.println(input);
if (input.equals("q"))
{
break;
}

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = in.readLine();
System.out.println("服务器回应说:" + str);

out.flush();

} }
finally
{
System.out.println("关闭");
socket.close();
}
}
}问题:
开启服务器和客户端后,两方一来一回聊天这种形式是可以的!但是,为什么不能是某一方不断说话?而不管另一方是否应答?!比如客户端发送"HI"然后回车,这时候轮到了服务器说话了,但现在服务器不要说话,客户端继续发送"你好啊"这样,我发现这样不行,发完"HI"之后回车了,信息是发出去了,但是如果继续发再回车就没发出了,这是为什么???

解决方案 »

  1.   

    那是因为当你的client发完消息后,会:BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String str = in.readLine();
                    System.out.println("服务器回应说:" + str);
    client在这里等待server的消息当然不能继续发消息了...
    你把它去掉就可以不停发消息了(server那边把相应的发消息代码去掉)
    但解决方法是就如楼上所说使用多线程...
    或者把发送消息和接受消息分开写成两部分,四个程序间进行交流(一发一收对应另外的一发一收).