本程序通过Socket编程实现:客户端向服务器发送信息,服务器将接收到的信息加以处理返回到客户端,并在控制台打印,如下:
服务器端代码如下:
public class Server {
/**
* 服务器端
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ServerSocket server = null;
Socket client = null; // 客户端端
try {
server = new ServerSocket(8888);
boolean f = true;
System.out.println("服务器运行,等待客户端连接....");
while(f){
client = server.accept();
new Thread(new EchoThread(client)){}.start();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
client.close();
}
}
}
考虑到客户端每次每次请求数据时,若服务器端只有一个线程处理数据时,那么当有多个客户端同时请求数据时,单个线程将会被阻塞,不能达到多用户实时效果。本程序对于每一个客户端的请求,都会单独为之开一个新的线程,从而达到多用户实时效果。线程代码如下:
public class EchoThread implements Runnable {
private Socket client = null;
public EchoThread(Socket client){
this.client = client;
}
@Override
public void run() {
PrintStream out = null; // 打印流
BufferedReader buf = null; // 接收输入流
try {
out = new PrintStream(client.getOutputStream());
// 准备接收客户端的输入信息
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag = true;
while(flag){
String str = buf.readLine(); // 接收客户端发过来的内容
if(str==null || "".equals(str) || "bye".equals(str)){
flag = false;
}else{
out.println("ECHO:" + str); // 回应信息
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
out.close();
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码如下循环接收从键盘输入的信息,并发送到服务器端,直到输入“bye”,程序退出,代码如下:
public class Client {
/**
* 客户端
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
Socket client = null;
PrintStream out = null;
client = new Socket("localhost", 8888);
BufferedReader buf = null; // 一次性接收完成
BufferedReader input = null; // 接收键盘消息
input = new BufferedReader(new InputStreamReader(System.in));
buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintStream(client.getOutputStream());
boolean flag = true;
while(flag){
System.out.println("输入信息: ");
String str = input.readLine(); // 接收键盘输入消息
out.println(str);
if("bye".equals(str)){
flag = false;
}else{
String echo = buf.readLine(); // 接收返回结果
System.out.println(echo); //输出回应消息
}
}
buf.close();
client.close();
}
}