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();
	}
}






  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java实现多线程的echo可以通过使用线程池和Socket编程来实现。下面是一个简单的示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class EchoServer { private ServerSocket serverSocket; private ExecutorService executorService; public EchoServer(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); executorService = Executors.newFixedThreadPool(poolSize); System.out.println("Echo Server started on port " + port); } public void start() { try { while (true) { Socket clientSocket = serverSocket.accept(); executorService.execute(new ClientHandler(clientSocket)); } } catch (IOException e) { e.printStackTrace(); } } public void stop() throws IOException { serverSocket.close(); executorService.shutdown(); } private static class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { try ( PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())) ) { String inputLine; while ((inputLine = in.readLine()) != null) { out.println("Server: " + inputLine); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { EchoServer echoServer = new EchoServer(8080, 10); echoServer.start(); } } ``` 上述代码中,我们创建了一个EchoServer类,其中包含了一个内部类ClientHandler来处理客户端的请求。EchoServer类使用线程池来管理多个线程,每当有新的客户端连接时,就会创建一个新的ClientHandler线程来处理该客户端的请求。 在ClientHandler的run方法中,我们使用PrintWriter和BufferedReader来进行输入输出操作。当客户端发送消息时,服务器会将消息加上前缀"Server: "后返回给客户端。 相关问题: 1. 什么是线程池? 2. 如何在Java中创建Socket连接? 3. 什么是输入输出流? 4. 为什么要使用线程池来管理多线程任务?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值