Java基础Socket运用——服务端和客户端的信息交换
题目:小明喜欢小红,小红只会回复小明的消息,小明要主动发送消息,但是一旦双方中的一人说出了“再见”,则关系结束。
如题,小红为服务端,小明为客户端,服务端先运行等待客户端的数据,然后将自己的数据返回客户端。
首先,我们先搭建好服务端。
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class PS_Server { public static void main(String[] args) { try { //创建服务端端口 ServerSocket serverSocket = new ServerSocket(5000); //创建端口对象,存储服务端输入的数据 Socket socket = null; while (true) { System.out.println("等待数据中........."); //接收端口传来的数据 socket = serverSocket.accept(); //将接受到的数据导入传输流中 InputStream is = socket.getInputStream(); //读取输入流中的内容 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String context; while ((context = br.readLine()) != null) { System.out.println("小明:" + context); if (context.equals("再见")){ System.out.println("对面已关闭链接"); return; } } //输入回复内容 Scanner in = new Scanner(System.in); System.out.print("回复小明:"); String reply = in.next(); //将回复内容返回发送端,将回复内容输入到输出流 OutputStream os = socket.getOutputStream(); //转换为字节输出 os.write(reply.getBytes()); System.out.println("发送成功!"); if (reply.equals("再见")) { break; } //关闭流 os.close(); br.close(); is.close(); } socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
接着,再搭建客户端。
import java.io.*; import java.net.Socket; import java.util.Scanner; public class PC_Client { public static void main(String[] args) { try { while (true) { //创建客户端端口 Socket socket = new Socket("localhost", 5000); //将端口数据传入输出流 OutputStream os = socket.getOutputStream(); //输入需要发送的信息 System.out.print("正在向小红发送信息:"); Scanner in = new Scanner(System.in); String reply = in.next(); //将信息发送 os.write(reply.getBytes()); System.out.println("发送成功!"); socket.shutdownOutput();//完成发送,关闭输出 if (reply.equals("再见")) { break; } InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String serverReply; while ((serverReply = br.readLine()) != null) { System.out.println("小红(主机):" + serverReply); if (context.equals("再见")){ System.out.println("对面已关闭链接"); return; } } os.close(); } } catch (IOException e) { e.printStackTrace(); } } }
当双方任意一人发送“再见”时,端口关闭,程序退出。