一、ECHO意爲應答,程序的功能是客戶端向服務器發送一個字符串,服務器不做任何處理,直接把字符串返回給客戶端,ECHO是自己笨的客戶/服務器程序。
二、目前爲止我們編寫的程序中,服務器只能處理一個客戶端的鏈接,要想服務器同時處理多個客戶端的請求鏈接,就必須加入多線程的處理機制,將每一個客戶端程序都創建一個新的線程對象。
服務端代碼
package us.google.www;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServerDemo {
public static void main(String[] args) throws IOException {
//創建一個服務器端的socket
ServerSocket ss = new ServerSocket(8888);
System.out.println("服務器已啓動。。。。");
boolean flag = true;
while (flag) {
System.out.println("正在等待連接");
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
class UserThread implements Runnable
{
private Socket s ;
public UserThread(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
System.out.println(s.getInetAddress().getHostAddress()+"已連接");
try {
//獲取輸出輸出流
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(
new BufferedOutputStream(s.getOutputStream()));
boolean bool = true;//循環接受數據
while (bool) {
String info= br.readLine();
if ("".equals(info)||"bye".equals(info)) {
bool = false;
}
else {
System.out.println(info);
ps.println("echo:"+info);
ps.flush();
}
}
ps.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端 代碼
package us.google.www;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* echo客戶端程序
* @author chongrubujing
*
*/
public class EchoClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("192.168.0.51",8888);
System.out.println("與服務器連接成功!");
Scanner input = new Scanner(System.in);
boolean flag = true;
//獲取輸入輸出流
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(
new BufferedOutputStream(s.getOutputStream()));
while (flag) {
System.out.println("請輸入:");
String info = input.nextLine();
if("bye".equals(info))
{
flag = false;
}
else {
ps.print(info);
ps.flush();
System.out.println(br.readLine());
}
}
ps.close();
br.close();
}
}