JAVA 實現 EchoServer EchoClient 服務器、客戶機本地通信程序

新手入門,照着課本敲的,自己加的註釋,若有錯誤,敬請指出。

接着會自己試着寫多線程的、異地交流的一些東東。


前兩個代碼是客戶機發話,服務器傻逼式迴應;後面兩個代碼是客戶機和服務器都是人工的,當線程的,輪流輸入通信。


運行情況:

SERVER:

服務器啓動
New connection accepted/127.0.0.1:2924
1
2
3
4
5
dxgjdfjg
bye]
bye


CLIENT:

How are you ! I am amy . you can talk with me .
1
Amy:YES!
2
Amy:I love you!
3
Amy:I love xiaopan!
4
Amy:Sorry I can't understand you!
5
Amy:Sorry I can't understand you!
dxgjdfjg
Amy:Sorry I can't understand you!
bye]
Amy:Sorry I can't understand you!
bye
Amy:See You!




【SERVER】

package socketserver;

/**
 * EchoServer Server program
 * can do easy talk with Client
 * @author Amy
 * make in 2014/2 
 * @Version 1.0
 */

import java.io.*;
import java.net.*;

public class EchoServer {  //服務端程序
	private int port = 8000;  //鏈接端口
	private ServerSocket serverSocket;

	public EchoServer() throws IOException {	//開啓服務端程序
		serverSocket = new ServerSocket(port);	//指定通信端口並開啓服務
		System.out.println("服務器啓動");
	}

	public String echo(String msg) {	//給恢復信息加前綴
		return "Amy:" + msg;
	}

	private PrintWriter getWriter(Socket socket) throws IOException {	//給客戶機回覆交流語句
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut, true);
	}

	private BufferedReader getReader(Socket socket) throws IOException {	//用於讀取客戶機交流語句
		InputStream scoketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(scoketIn));
	}

	public void server() {		//服務程序
		Socket socket = null;	//清空客戶機連接
		try {
			socket = serverSocket.accept();// 等待客戶機連接
			System.out.println("New connection accepted"
					+ socket.getInetAddress() + ":" + socket.getPort());	//客戶機連接成功,給出新連接客戶機IP地址及連接端口號
			BufferedReader br = getReader(socket);	//讀取客戶機交流語句
			PrintWriter pw = getWriter(socket);
			pw.println("How are you ! I am amy . you can talk with me .");	//交流問候語
			String msg = null;	//清空對話緩存內容
			while ((msg = br.readLine()) != null) {	//讀取客戶機交流語句 若不爲空
				System.out.println(msg);	//輸出到服務端控制檯
				
				if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信
				{
					pw.println(echo("See You!"));	//給客戶機恢復對應語句//要結束服務了:下次再見
					break;	//結束服務 斷開連接
				}
				else if(msg.equals("1"))	//與客戶機交流
				{
					pw.println(echo("YES!"));
				}
				else if(msg.equals("2"))
				{
					pw.println(echo("I love you!"));
				}
				else if(msg.equals("3"))
				{
					pw.println(echo("I love xiaopan!"));
				}
				else
				{
					pw.println(echo("Sorry I can't understand you!"));
				}
			}
		} catch (IOException e) {	//異常
			e.printStackTrace();
		} finally {
			try {
				if (socket != null)	//客戶機關閉客戶端
					socket.close();// 斷開連接
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws IOException {	//main
		new EchoServer().server();
	}
}
【CLIENT】

/**
 * EchoClient Client program
 * can talk with Server
 * @author Amy
 * make in 2014/2 
 * @Version 1.0
 */

import java.io.*;
import java.net.*;
import java.util.*;

public class EchoClient {	//客戶端
	private String host = "localhost";	//與本地服務端器通信
	private int port = 8000;	//指定通信端口
	private Socket socket;

	public EchoClient() throws IOException {	//與服務端建立連接,收到“問候語”表示連接成功
		socket = new Socket(host, port);	//與指定的服務器的指定端口連接
	}

	private PrintWriter getWriter(Socket socket) throws IOException {	//給服務端發送回話語句
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut, true);
	}

	private BufferedReader getReader(Socket socket) throws IOException {	//接收服務端的會話語句
		InputStream socketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(socketIn));
	}

	public void talk()throws IOException{ //與服務端回話程序
		try{
			BufferedReader br=getReader(socket);	//接收服務端的會話語句
			PrintWriter pw=getWriter(socket);		//給服務端發送回話語句
			BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
			String msg=null;	//清空語句緩存
			System.out.println(br.readLine());		//輸出服務端會話語句到服務檯,連接成功的“問候語句”
			while((msg=localReader.readLine())!=null){	//讀取到本地客戶端控制檯語句,不爲空
				pw.println(msg);	//給服務端發送本地客戶端控制檯輸入的會話語句
				System.out.println(br.readLine());	//將接收到的服務端發來的會話語句輸出到本地客戶端控制檯
				if(msg.equals("bye"))break;
			}
		}
		catch(IOException e){
			e.printStackTrace();
		}
		finally
		{
			try{
				socket.close();	//斷開連接
			}
			catch(IOException e){
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws IOException{	//main
		new EchoClient().talk();
	}
}


自主對話:

【Server】

/**
 * EchoServer Server program
 * user can talk with Client
 * @author Amy
 * make in 2014/2 
 * @Version 1.1
 */

import java.io.*;
import java.net.*;

public class EchoServer {  //服務端程序
	private int port = 8000;  //鏈接端口
	private ServerSocket serverSocket;

	public EchoServer() throws IOException {	//開啓服務端程序
		serverSocket = new ServerSocket(port);	//指定通信端口並開啓服務
		System.out.println("服務器啓動");
	}

	public String echo(String msg) {	//給恢復信息加前綴
		return "Amy:" + msg;
	}

	private PrintWriter getWriter(Socket socket) throws IOException {	//給客戶機回覆交流語句
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut, true);
	}

	private BufferedReader getReader(Socket socket) throws IOException {	//用於讀取客戶機交流語句
		InputStream scoketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(scoketIn));
	}

	public void server() {		//服務程序
		Socket socket = null;	//清空客戶機連接
		try {
			socket = serverSocket.accept();// 等待客戶機連接
			System.out.println("New connection accepted"
					+ socket.getInetAddress() + ":" + socket.getPort());	//客戶機連接成功,給出新連接客戶機IP地址及連接端口號
			BufferedReader br = getReader(socket);	//讀取客戶機交流語句
			PrintWriter pw = getWriter(socket);	//將會話內容發送給客戶端
			BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
			
			pw.println("How are you ! I am amy . you can talk with me .");	//交流問候語
			String msg = null;	//清空對話緩存內容
			while ((msg = br.readLine()) != null) {	//讀取客戶機交流語句 若不爲空
				System.out.println(msg);	//輸出到服務端控制檯
				
				if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信
				{
					pw.println(echo("See You!"));	//給客戶機恢復對應語句//要結束服務了:下次再見
					break;	//結束服務 斷開連接
				}
				else
				{
					msg=localReader.readLine();//讀取本地服務端控制檯內容
					pw.println(echo(msg));
				}
				/*else if(msg.equals("1"))	//與客戶機交流
				{
					pw.println(echo("YES!"));
				}
				else if(msg.equals("2"))
				{
					pw.println(echo("I love you!"));
				}
				else if(msg.equals("3"))
				{
					pw.println(echo("I love xiaopan!"));
				}
				else
				{
					pw.println(echo("Sorry I can't understand you!"));
				}*/
			}
		} catch (IOException e) {	//異常
			e.printStackTrace();
		} finally {
			try {
				if (socket != null)	//客戶機關閉客戶端
					socket.close();// 斷開連接
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws IOException {	//main
		new EchoServer().server();
	}
}



【CLIENT】


/**
 * EchoClient Client program
 * user can talk with Server
 * @author Amy
 * make in 2014/2 
 * @Version 1.1
 */

import java.io.*;
import java.net.*;
import java.util.*;

public class EchoClient {	//客戶端
	private String host = "localhost";	//與本地服務端器通信
	private int port = 8000;	//指定通信端口
	private Socket socket;

	public EchoClient() throws IOException {	//與服務端建立連接,收到“問候語”表示連接成功
		socket = new Socket(host, port);	//與指定的服務器的指定端口連接
	}

	private PrintWriter getWriter(Socket socket) throws IOException {	//給服務端發送回話語句
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut, true);
	}

	private BufferedReader getReader(Socket socket) throws IOException {	//接收服務端的會話語句
		InputStream socketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(socketIn));
	}

	public void talk()throws IOException{ //與服務端回話程序
		try{
			BufferedReader br=getReader(socket);	//接收服務端的會話語句
			PrintWriter pw=getWriter(socket);		//給服務端發送回話語句
			BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
			String msg=null;	//清空語句緩存
			System.out.println(br.readLine());		//輸出服務端會話語句到服務檯,連接成功的“問候語句”
			while((msg=localReader.readLine())!=null){	//讀取到本地客戶端控制檯語句,不爲空
				pw.println(msg);	//給服務端發送本地客戶端控制檯輸入的會話語句
				System.out.println(br.readLine());	//將接收到的服務端發來的會話語句輸出到本地客戶端控制檯
				if(msg.equals("bye"))break;
			}
		}
		catch(IOException e){
			e.printStackTrace();
		}
		finally
		{
			try{
				socket.close();	//斷開連接
			}
			catch(IOException e){
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws IOException{	//main
		new EchoClient().talk();
	}
}






發佈了150 篇原創文章 · 獲贊 35 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章