zoukankan      html  css  js  c++  java
  • 多个client与一个server端通信的问题

    多个client与一个server端通信的问题

    上篇博文主要是讲的关于client与server端的通信问题。在上篇博文中当我们仅仅有一个client訪问我们的server时是能够正常执行的,可是当我们有多个client訪问我们的server时。我们的代码就不能正常工作了。

    而在现实中。我们是非常少有一个server仅仅供一个client訪问的,此篇博文就是来解决多个client訪问我们server端的问题
    解决方法:

    • 用一个多线程就能够解决

    实现代码例如以下:
    第一个:client的代码例如以下:

    package org.wrh.socketserver;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class MyClient {
    
        public static void main(String[] args) throws Exception {
            //第一步:创建clientSocket
            Socket s=new Socket("192.168.1.107",4567);
            //第二步:读取向server端发送的数据文件
            FileInputStream fis=new FileInputStream("d:\100.txt");
            //第三步:获取Socket输出流
            OutputStream os=s.getOutputStream();
    
            byte[] buf=new byte[1024];
            int len;
            while((len=fis.read(buf))!=-1){
                os.write(buf, 0, len);
    
            }
            //刷新一下缓冲区的数据
            os.flush();
            //告诉server。我的数据已经发送完了
            s.shutdownOutput();
    
            //将server返回的数据读取出来
            InputStream is=s.getInputStream();
            byte[] buf_in=new byte[1024];
            int len_in=is.read(buf_in);
            System.out.println(new String(buf_in,0,len_in));
    
    
            fis.close();
            os.close();
            is.close();
            s.close();
    
        }
    
    }
    

    第二个:server端的代码例如以下

    package org.wrh.socketserver;
    
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class MyServer {
    
        public static void main(String[] args) throws Exception {
            //第一步:建立server端Socket
            ServerSocket ss=new ServerSocket(4567);
            while(true){
                //第二步:获取client
                Socket socket=ss.accept();
                /*
                 * 当我们考虑多个client訪问server端的时候,我们就须要考虑多线程的问题
                 * */
                new Thread(new TaskWork(socket)).start();
            }
    
        }
    
    }
    

    当中,线程类的代码例如以下

    package org.wrh.socketserver;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TaskWork implements Runnable {
        Socket socket;
        public TaskWork(Socket socket){
            this.socket=socket;
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            int count=0;
            /*
             * 获取client的ip地址
             * */
            String ip=socket.getInetAddress().getHostAddress();
            System.out.println(ip+"....connected");
            //第三步:获取Socket的输入流,对client发送来的数据进行读取
            try{
                InputStream is=socket.getInputStream();
    
                /*
                 *读取数据,并 将数据写入到文件里
                 * */
                File dir=new File("d:\wu");
                if(!dir.exists()){
                    dir.mkdirs();
    
                }
    
                File file=new File(dir,ip+".txt");
                /*
                 * 假设在server端此文件已经存在的处理办法
                 * */
                if(file.exists()){
                    file=new File(dir,ip+"("+(++count)+").txt");
                }
    
                FileOutputStream fos=new FileOutputStream(file);
    
    
                byte[] buf=new byte[1024];
                int len=0;
                while((len=is.read(buf))!=-1){
                    fos.write(buf, 0, len);
    
                }
                fos.flush();
    
                //给client一个反馈信息
                OutputStream os=socket.getOutputStream();
                os.write("收到数据".getBytes());
    
                //以下为关闭各种要关闭的资源
                fos.close();
                is.close();
                os.close();
                socket.close();
    
            }
            catch(Exception e){
                e.printStackTrace();
            }
    
    
        }
    
    }
    

    假设上篇博文的代码你弄懂了。这篇博文的代码理解起来就相当easy啦

    说明

    • 上面的代码中。主线程一直在等待这client的连接,仅仅要一有client连接进来。就会开启一个子线程来执行对应的操作。
  • 相关阅读:
    linux下php环境的装配以及php storm的链接
    p4 : a problem about "./behavioral-model"
    p4factory下 targets/basic_rout
    P4安装
    第二次结对编程作业——毕业导师智能匹配
    初识GIT
    结对项目之需求分析与原型设计
    调研《构建之法》指导下的全国高校的历届软工实践作品、全国互联网+竞赛、物联网竞赛等各类全国性大学生信息化相关的竞赛平台的历届作品及其看法
    SDN 收集一下最近的资料
    软件工程的实践项目课程的自我目标
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7136071.html
Copyright © 2011-2022 走看看