多个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连接进来。就会开启一个子线程来执行对应的操作。
posted @ 2017-07-08 10:41  lytwajue  阅读(623)  评论(0编辑  收藏  举报