服务器端:
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下开两个窗口运行效果较好。