import java.net.*;
import java.io.*;public class ChatServer {
public static void main(String args[]) {
InputStream is = null;
OutputStream os = null;
try {
ServerSocket ss = new ServerSocket(5678);
Socket socket = ss.accept();
is = socket.getInputStream();
os = socket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os);
System.out.println("Client:" + dis.readLine());
String s = br.readLine();
while(!s.equals("bye")) {
pw.write(s);
pw.flush();
System.out.println("Server:" + s);
System.out.println("Client:" + dis.readLine());
s = br.readLine();
}
pw.close();
dis.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;public class ChatClient {
public static void main(String args[]) {
InputStream is = null;
OutputStream os = null;
try {
Socket socket = new Socket("127.0.0.1", 5678);
is = socket.getInputStream();
os = socket.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader dis = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(os);
String s = br.readLine();
while(!s.equals("bye")) {
pw.write(s);
pw.flush();
System.out.println("Client:" + s);
System.out.println("Server:" + dis.readLine());
s = br.readLine();

pw.close();
dis.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

解决方案 »

  1.   

    本来是当客户端输入hello,主机端显示hello,为什么主机端显示不了,而且不能动了
      

  2.   

    我预期的效果应该是这样的:当客户端输入hello的时候,两端都可以显示。当主机端输入hey的时候,两端都可以显示。现在的问题是客户端输入hello,显示完后,就卡住了。而主机端也无任何显示。问题出现在哪里我也搞不懂!
      

  3.   

    你把pw.write(s);改成pw.println(s);看看
      

  4.   

    所谓交互是要有人先说话,你的服务端第一句是 read,客户端第一句也是 read,那该谁 write 呢?要知道 read 是一个阻塞的操作,也就是说对方没有 write 的话,你的 read 一直阻塞等待,整个线程就死在那儿。write 也是一样,当网络很忙时它总是补发丢失的 UDP 包或对方的接收缓冲区满了来不及处理数据包也要等待。
    Socket 现在都是支持全双工的,那就是你的读取-对方写 和 你的写-对方读这两条线可以同时工作,因些很多情况下是为上面这两条流水线各开一条线程去处理。当然以后你再使用 NIO (异步非阻塞式的 socket)时,它是基于事件的方式工作,有数据时通知你读,能写的时候通知你写。就可以不用阻塞了。