socket编程1-EchoServer

it2026-04-19  1

代码解析:   service()方法 不断等待客户端程序的连接请求,serversocket.accept()得到socket对象后,表示建立连接,从Socket对象中得到输入流、输出流,分别用PrintWriter 和 BufferedReader来装饰。不断的用BufferedReader对象的readLine()方法读取客户端程序发来的字符串,再调用BufferWriter对象的println()方法向客户返回字符串“返回响应”。当读取到客户端发来“bye”字符串后,结束通信,关闭连接。

package Chapter1;

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

public class EchoServer {     private ServerSocket server;     private int port = 8000;     Socket socket;

    public static void main(String[] args) throws IOException {         /*          * //返回本地主机ip地址 InetAddress addr=InetAddress.getLocalHost();          * //返回代表"222.34.5.7"的IP地址 InetAddress          * addr2=InetAddress.getByName("222.34.5.7");          * //返回域名为"www.baidu.com"的ip地址 InetAddress          * addr3=InetAddress.getByName("www.baidu.com");          */         new EchoServer().service();     }

    /**      * 服务器端程序一直监听端口,来接收客户端程序的连接请求。      * 如接收到连接请求,accept()方法就返回一个Socket对象,此对象与客户端的Socket对象形成一条通信线路,建立连接      */     public EchoServer() throws IOException {         server = new ServerSocket(port); // 1.创建ServerSocket对象,在构造方法中指定监听的端口         System.out.println("服务器端程序启动,等待客户端程序访问");         socket = server.accept(); // 2.调用ServerSocket对象的accept()方法,来监听端口,等待客户端程序的连接请求。         System.out.println("service开始连接客户端 " + socket.getInetAddress() + ":"                 + socket.getPort());     }

    public void service() {

        try {             BufferedReader br;             br = getReader(socket);             PrintWriter pw = getWriter(socket);             String msg = null;             msg = br.readLine();             System.out.println("service接收到客户端数据:" + msg);             if (msg != null) {                 if (msg.equals("bye")) {                     pw.println("over");                     System.out.println("客户端已发送\"bye\",服务端返回\"over\",将关闭服务端socket");                     socket.close();                 } else {                     pw.println("service返回响应\"" + msg + "\"");                 }             } else{                 System.out.println("service 未得到客户端数据");             }         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }         // finally {         // if (socket != null)         // try {         // socket.close();         // System.out.println("服务端socket已关闭");         // } catch (IOException e) {         // // TODO Auto-generated catch block         // e.printStackTrace();         // }         // }     }

    /*      * Socket类提供了getInputStream()、getOutputStream()方法,分别返回输入流InputStream对象      * 、输出流OutputStream对象, 向输出流写数据---向对方发送数据 从输入流读数据---接收来自对方的数据      *      * InputStream socketIn=socket.getInputStream(); BufferedReader br=new      * BufferedReader(new InputStreamReader(socketIn));      *      * OutputStream socketOut=socket.getOutputStream();      * //参数true表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地 PrintWriter pw=new      * PrintWriter(socketOut,true);      */

    private BufferedReader getReader(Socket socket) throws IOException {

        InputStream socketIn = socket.getInputStream();         BufferedReader br = new BufferedReader(new InputStreamReader(socketIn));         return br;     }

    private PrintWriter getWriter(Socket socket) throws IOException {         OutputStream socketOut = socket.getOutputStream();         PrintWriter pw = new PrintWriter(socketOut, true);         return pw;     }

}

转载于:https://www.cnblogs.com/stay-sober/p/4158793.html

最新回复(0)