栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

17.Socket双向通讯(ECHO程序)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

17.Socket双向通讯(ECHO程序)

服务端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	private ServerSocket server;
	
	public EchoServer() throws IOException {
		//创建服务端套接字对象
		this.server = new ServerSocket(8888);
		System.out.println("服务器启动:"+8888+"端口监听连接请求。");
	}
	
	//服务器主要的处理逻辑
	public void service() {
		//s是否关闭服务端连接
		boolean flag = true;
		while(flag) {
			Socket socket = null;
			try {
				//获取连接的客户端套接字对象
				socket = server.accept();
				//获取socket相关的输入流和输出流
				BufferedReader reader = getReader(socket);
				BufferedWriter writer = getWriter(socket);
				//保存客户端发送的数据
				String data = null;
				//读取客户端发送的数据
				while( (data=reader.readLine()) != null ) {
					//当获取的信息是'bye'是,关闭流
					if( "byt".equals(data) ) {
						flag = false;
						if(reader != null) {
							reader.close();
						}
						if(writer != null) {
							writer.close();
						}
						break;
					}else {
						System.out.println("来自客户端的数据:"+data);
						//回写给客户端的数据
						writer.write("echo:"+data);
						//插入一个行分隔符,readLine()方法用来判定字符串有没有结束
						writer.newline();
						//刷新缓冲区
						writer.flush();
					}
				}
			} catch (Exception e) {
				//出错则结束循环
				flag = false;
			}finally {
				try {
					if(server != null && (!server.isClosed())) {
						server.close();
						System.out.println("服务端关闭");
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	
	
	
	
	//获取socket相关的输入流对象
	private BufferedReader getReader(Socket socket) throws IOException {
		InputStream in = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(in));
	}
	
	//获取socket相关的输出流对象
	private BufferedWriter getWriter(Socket socket) throws IOException {
		OutputStream out = socket.getOutputStream();
		return new BufferedWriter(new OutputStreamWriter(out));
	}

	public static void main(String[] args) {
		try {
			new EchoServer().service();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

客户端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class EchoClient {
	private Socket socket;
	
	public EchoClient() {
		try {
			//创建客户端套接字对象
			this.socket = new Socket("127.0.0.1",8888);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void talkToServer() {
		System.out.println("请输入要发送给服务端的数据:");
		BufferedReader localReader = null;
		String data = null;
		//获取客户端套接字相关的输入流和输出流
		BufferedReader reader = getReader(socket);
		BufferedWriter writer = getWriter(socket);
		try {
			//创建读取用户输入的读取流
			localReader = new BufferedReader(new InputStreamReader(System.in));
			while((data=localReader.readLine()) != null){
				//如果客户端输入的是‘bye’则关闭IO流
				if("bye".equals(data)) {
					System.out.println("客户端关闭");
					if(reader!=null) {
						reader.close();
					}
					if(writer!=null) {
						writer.close();
					}
					break;
				}else {
					//readLine()方法必须读取到行分隔符才返回读取
					//所以传递给输入流的字符串必须包含行分隔符
					System.out.println("客户端输出的数据---->t"+data);
					writer.write(data);
					//插入一个行分隔符作为内容结束的标识
					writer.newline();
					//清空缓冲区
					writer.flush();
					//读取服务端返回的数据
					System.out.println("服务器相应的数据---->t"+reader.readLine());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//关闭客户端套接字连接
			try {
				if(socket!=null) {
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	private BufferedReader getReader(Socket socket) {
		try {
			InputStream in = null;
			BufferedReader reader = null;
			in = socket.getInputStream();
			reader = new BufferedReader(new InputStreamReader(in));
			return reader;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private BufferedWriter getWriter(Socket socket) {
		try {
			OutputStream out = null;
			BufferedWriter writer = null;
			out = socket.getOutputStream();
			writer = new BufferedWriter(new OutputStreamWriter(out));
			return writer;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		new EchoClient().talkToServer();
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号