下面是Server和Client的程序,想要实现的功能是打开两个cmd窗口分别运行两个程序以后,Client端和Server端的对话。程序如下:Server端:import java.net.*;
import java.io.*;public class TalkServer
{
public static void main(String[] args)
{
try
{
ServerSocket ss = null;
try
{
ss = new ServerSocket(8889);
}
catch(Exception e)
{
System.out.println("Cannot listen to: " + e);
}
String line;
Socket s = null;
try
{
s = ss.accept();
}
catch(IOException ie)
{
System.out.println("IOError: " + ie);
}

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream());
BufferedReader typeIn = new BufferedReader(new InputStreamReader(System.in));

//System.out.println("Client: " + br.readLine());
line = typeIn.readLine();

while(!line.equals("exit"))
{
pw.println(line);
pw.flush();
System.out.println("Server: " + line);
System.out.println("Client: " + br.readLine());
line = typeIn.readLine();
}
br.close();
pw.close();
s.close();
ss.close();

}
catch(Exception  e)
{
System.out.println("Error: " + e);
}
}
}Client端:import java.net.*;
import java.io.*;public class TalkClient
{
public static void main(String[] args)
{
try
{
Socket s = null;
try
{
s = new Socket("127.0.0.1", 8889);
}
catch(IOException ie)
{
System.out.println("Error: " + ie);
}

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream());
BufferedReader typeIn = new BufferedReader(new InputStreamReader(System.in));
//System.out.println("Server: " + br.readLine());
String line = typeIn.readLine();

while(!line.equals("exit") )
{
pw.println(line);
pw.flush();
System.out.println("Client: " + line);
System.out.println("Server: " + br.readLine());
line = typeIn.readLine();
}
br.close();
pw.close();
s.close();


}
catch(Exception  e)
{
System.out.println("Error: " + e);
}
}
}打开以后输入任何字符都不能显示。

解决方案 »

  1.   

    这个程序有问题的,readline()方法是阻塞式的,没收到数据会傻傻的一直等值,你Clinet端想Server端发了一个数据,你Server端不能马上打印出来,因为Server在执行while循环之前的readline()方法就已经卡住了。
      

  2.   

    还有你的Client端不断向Server端发数据,发着发着就不能发了。不信你试试!
      

  3.   

    我感觉这个程序怪怪的,Server在接收Client端得消息之前,Server端要先发送消息给Client,接着才能收到Client发送过来的消息,不觉得这样有问题吗?你收消息和发消息要起两个线程。不然会有冲突的!
      

  4.   

    while前面加上System.out.println("Server: " + br.readLine()); 也不行,服务端在收到客户端信息以后仍然不能及时显示,反之亦然。可是这句话本应该起作用的啊。实在想不出怎么改了,两位高手能否提示一下应该怎么改才能实现收到信息及时显示?
      

  5.   


    //这个也是我学JAVASE时写的C/S聊天的程序,缺点很多。但好歹能运行起
    import java.net.*;
    import java.util.Scanner;
    import java.io.*;public class Server { public static void main(String[] args) {
    try{
    ServerSocket server = new ServerSocket(1234);
    while(true) {
    Socket socket = server.accept();
    Thread t = new Thread(new serverWriter(socket));
    t.start();
    Thread t1 = new Thread(new serverReader(socket));
    t1.start();
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }}class serverWriter implements Runnable {
    private Socket socket;
    public serverWriter(Socket socket) {
    this.socket = socket;
    }
    public void run() {
    Scanner in = new Scanner(System.in);
    try {
    DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    while(true) {
    String info = in.nextLine();
    output.writeUTF(info);
    if(info.equalsIgnoreCase("bye")) {
    System.out.println("自己下线,退出程序");
    System.exit(0);
    }
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }class serverReader implements Runnable {
    private Socket socket;
    public serverReader(Socket socket) {
    this.socket = socket;
    }
    public void run() {
    try {
    DataInputStream input = new DataInputStream(socket.getInputStream());
    while(true) {
    String info = input.readUTF();
    System.out.println("对方说:" + info);
    if(info.equalsIgnoreCase("bye")) {
    System.out.println("对方下线了,结束通话…");
    System.exit(0);
    }
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  6.   


    //刚那个是Server的,这个是Client。毕竟是刚学时写的,LZ将就对比下看问题在哪。import java.net.*;
    import java.util.Scanner;
    import java.io.*;public class Client {
    public static void main(String[] args) {
    try {
    Socket socket = new Socket("localhost",1234);
    Thread t = new Thread(new clientWriter(socket));
    t.start();
    Thread t1 = new Thread(new clientReader(socket));
    t1.start();
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }class clientWriter implements Runnable {
    private Socket socket;
    public clientWriter(Socket socket) {
    this.socket = socket;
    }
    public void run() {
    Scanner in = new Scanner(System.in);
    try {
    DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    while(true) {
    String info = in.nextLine();
    output.writeUTF(info);
    if(info.equalsIgnoreCase("bye")) {
    System.out.println("自己下线,退出程序");
    System.exit(0);
    }
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }class clientReader implements Runnable {
    private Socket socket;
    public clientReader(Socket socket) {
    this.socket = socket;
    }
    public void run() {
    try {
    DataInputStream input = new DataInputStream(socket.getInputStream());
    while(true) {
    String info = input.readUTF();
    System.out.println("对方说:" + info);
    if(info.equalsIgnoreCase("bye")) {
    System.out.println("对方下线了,结束通话…");
    System.exit(0);
    }
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }