服务器端:
package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.*; import java.util.Scanner; public class ChatServer { public static void main(String[] args) { ServerSocket server = null; Socket client = null; try { server = new ServerSocket(6666); } catch (IOException e) { System.out.println("Connecting Error!"); System.exit(-1); } try { client = server.accept(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("Accept Error!"); System.exit(-1); } BufferedReader br = null; BufferedReader scan = null; PrintWriter pw = null; String line = null; String cMsg = null; try { br = new BufferedReader(new InputStreamReader(client.getInputStream())); scan = new BufferedReader(new InputStreamReader(System.in)); pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); cMsg = br.readLine(); while (!"bye".equalsIgnoreCase(cMsg)) { System.out.println("Client:"+cMsg); line = scan.readLine(); pw.println(line); pw.flush(); cMsg = br.readLine(); } if("bye".equalsIgnoreCase(cMsg)){ pw.println("bye"); pw.flush(); } client.close(); br.close(); scan.close(); pw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 客户端: package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class ChatClient { public static void main(String[] args) { Socket client = null; try { client = new Socket("127.0.0.1", 6666); } catch (UnknownHostException e) { System.out.println("Unknown Host"); System.exit(-1); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); BufferedReader scan = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); String line = null; String sMsg = null; while(!"bye".equalsIgnoreCase(sMsg)){ line = scan.readLine(); pw.println(line); pw.flush(); sMsg = br.readLine(); System.out.println("Server:"+sMsg); } if("bye".equalsIgnoreCase(sMsg)){ pw.println("bye"); pw.flush(); } client.close(); br.close(); scan.close(); pw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 说明:1. 需要先启动Server,再启动Client,并且由Client先发送信息。
2. Server在启动中,不能再次启动Server 。
3. server.accept(),以及流的读操作都是阻塞的,如果没有客户端连接,或者没有读入到数据,则会一直等待。
4. 使用PrintWriter进行print后,必须flush(),否则读取不到。这是因为flush方法是强制刷新缓冲区。何谓缓冲区呢,就是在你本机器上创建一个空间,这个空间可以让你先放些东西进去,比如你os.println进去的内容,如果你不调用flush,那么println进去的内容就只是留在缓冲区中,而不是进入网络传输通道传输到客户端或者服务器端。
5. 程序是同步式的,即只能Client发送一次信息,Server再发送一次,Client再发送一次......待改进。
6. 程序在cmd下开两个窗口运行效果较好。