*网络编程(Echo模型/聊天室模型)

Echo是一个经典的程序开发模型,本程序的意义在于:客户端随意输入信息并且将信息发送给服务器端,服务器端接收后前面加上一个"ECHO"的标记返回。

本程序设计如下:
由于需要采用多次输入的形式,所以不能够每次连接后立刻关闭服务端
可以设置一个字符串,如果输入了byebye,那么才表示结束本次的操作。

范例:实现服务器端

public class TestDemo{
    
    public static void main(String[] args) throws Exception{
        ServerSocket server=new ServerSocket(9999);
        System.out.println("等待客户端连接=====");
        Socket client=server.accept();//等待客户端连接
        //客户端输入数据(InputStream) 以及向客户端输出数据(OutputStream)
        Scanner scanner=new Scanner(client.getInputStream());
        PrintStream out=new PrintStream(client.getOutputStream());
        boolean flag=true;
        while(flag){
            if(scanner.hasNext()){
                String str=scanner.next().trim();//得到客户端信息 trim方法去掉输入字符串空格
                if(str.equalsIgnoreCase("byebye")){//程序要结束
                    out.println("bye~~~~~~~~~~~~~~~");
                    flag=false;
                }else{//一下子回应输入信息
                    out.println("ECHO:"+str);
                }
            }
        }
        scanner.close();
        out.close();
        client.close();
        server.close();
    }

}

范例:客户端:

public class Member {
    public static void main(String[] args) throws Exception{
        Socket client=new Socket("localhost",9999);//连接服务器 主机号加端口号
        Scanner input=new Scanner(System.in);//取得键盘输入对象
        Scanner scan=new Scanner(client.getInputStream());//取得输入流
        PrintStream out=new PrintStream(client.getOutputStream());//取得输出流
        input.useDelimiter("\n");//设置分隔符
        scan.useDelimiter("\n");
        
        boolean flag=true;
        //这里对于客户端的输入流input是键盘 scan是服务器 输出流是服务器端
        while(flag){
            System.out.println("请输入要发送数据");
            if(input.hasNext()){//键盘输入流
                String str=input.next().trim();//取得键盘输入对象
                out.println(str);//键盘输入数据通过客户端给服务器端
                if(str.equalsIgnoreCase("byebye")){
                    flag=false;
                }
                //服务器输入流 对服务器一下子返回的信息作出响应
                if(scan.hasNext()){
                    System.out.println(scan.next());
                }
            }
        }
        input.close();
        scan.close();
        out.close();
        client.close();
    }
}

此时就实现了一个最简单的服务器端和客户端通讯。

此时的程序只能够连接一个客户端,而不能连接其它客户端,因为所有的程序都在主线程中开发,所以说此时的程序是单线程的网络应用,所以为了能够让一个服务器端同时处理多个客户端的操作,我们使用多线程操作,把每一个连接到服务器端的客户都作为一个独立的线程对象保留:
范例:修改服务器端

class EchoThread implements Runnable{
    private Socket client;
    public EchoThread(Socket client){
        this.client=client;
    }
    @Override
    public void run() {
    try{
        //客户端输入数据(InputStream) 以及向客户端输出数据(OutputStream)
        Scanner scanner=new Scanner(client.getInputStream());
        PrintStream out=new PrintStream(client.getOutputStream());
        boolean flag=true;
        while(flag){
            if(scanner.hasNext()){
                String str=scanner.next().trim();//得到客户端信息 trim方法去掉输入字符串空格
                if(str.equalsIgnoreCase("byebye")){//程序要结束
                    out.println("bye~~~~~~~~~~~~~~~");
                    flag=false;
                }else{//一下子回应输入信息
                    out.println("ECHO:"+str);
                }
            }
        }
        scanner.close();
        out.close();
        client.close();
    }catch(Exception e){
        e.printStackTrace();
    }
    }
}

public class TestDemo{
    
    public static void main(String[] args) throws Exception{
        ServerSocket server=new ServerSocket(9999);
        System.out.println("等待客户端连接=====");
        boolean flag=true;
        while(true){//每一个客户端连接都开启一个多线程
            Socket client=server.accept();//等待客户端连接
            new Thread(new EchoThread(client)).start();//多线程
        }
        server.close();
    }

}

服务器开发的基础要素:
网络支持类,IO,多线程

总结

对于网络编程,我们很少会去进行其实际的开发,了解基本概念就可以了。

你可能感兴趣的:(*网络编程(Echo模型/聊天室模型))