zoukankan      html  css  js  c++  java
  • 套接字的多线程技术

    上一次的用的套接字如果不受到数据就会有阻塞

    我们可以使用多线程技术,把数据发过去,由服务器端的线程来操作,一个线程操作一个发过去的数据,然后发回来,不会阻塞客户端

    测试代码

    客户端

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.URL;
    import java.util.Scanner;
    
    public class Test {
        public static void main(String args[]){
            DataInputStream in=null;
            DataOutputStream out=null;
            Socket socket1 = null;
            InetAddress ip = null;
            Read read1=null;
            Thread thread1;
            try{
                read1=new Read();
                thread1=new Thread(read1);
    //            ip=InetAddress.getByName("127.0.0.1");
    //            InetSocketAddress ip2=new InetSocketAddress(ip,2010);
    //            System.out.println("3333");
    //            if(socket1.isConnected()){}
    //            else{
    //                    System.out.println("3333");
    //                    socket1.connect(ip2);
    //                    System.out.println("222");
                        socket1=new Socket("127.0.0.1",2017);
                        in=new DataInputStream(socket1.getInputStream());
                        out=new DataOutputStream(socket1.getOutputStream());
                        read1.setInputStream(in);
                        thread1.start();
    //            }
            }
            catch(Exception e){
                System.out.println("111");
                System.out.println(e.getMessage());
            }
            Scanner scanner1=new Scanner(System.in);
            for(;scanner1.hasNext();){
                double r=scanner1.nextDouble();
                try{
                    out.writeDouble(r);
                }
                catch(Exception e){
                    System.out.println(e.getMessage());
                    System.out.println("444");
                }
            }
        }
    }
    
    class Read implements Runnable{
        private URL url;
        private DataInputStream in1;
        void setInputStream(DataInputStream a){
            in1=a;
        }
        public void run(){
            double result=0;
            for(;;){
                try{
                    result=in1.readDouble();
                    System.out.println("受到了"+result);
                }
                catch(Exception e){
                    System.out.println("333");
                    System.out.println(e.getMessage());
                }
            }
        }
    }
    View Code

    服务器端

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class test2{
        public static void main(String args[]){
            DataInputStream in=null;
            DataOutputStream out=null;
            ServerSocket serverSocket1=null;
            Socket socket1 = null;
            readAndWrite thread1;
            for(;;){
                try{
                    serverSocket1=new ServerSocket(2017);
                    
                }
                catch(Exception e){
                    System.out.println("111");
                    System.out.println(e.getMessage());
                }
                try{
                    socket1=serverSocket1.accept();
                    
                }
                catch(Exception e){
                    System.out.println("22");
                    System.out.println(e.getMessage());
                }
                if(socket1!=null)
                    new readAndWrite(socket1).start();
            }
        }
    }
    
    class readAndWrite extends Thread{
        DataInputStream in=null;
        DataOutputStream out=null;
        Socket socket1;
        double a,b;
        readAndWrite(Socket socket){
            socket1=socket;
        }
        @Override
        public void run() {
            // TODO 自动生成的方法存根
            for(;;){
                try {
                    in=new DataInputStream(socket1.getInputStream());
                    out=new DataOutputStream(socket1.getOutputStream());
                    a=in.readDouble();
                    System.out.println("受到"+a);
                    b=a*2;
                    try{
                        Thread.sleep(3000);//故意拖慢,显示结果
                    }
                    catch(Exception e){
                        System.out.println(e.toString());
                    }
                    out.writeDouble(b);
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    System.out.println("111");
                    System.out.println(e.getMessage());
                }
            }
        }
        
    }
    View Code

    效果

  • 相关阅读:
    【codecombat】 试玩全攻略 第九关 循环又循环
    【codecombat】 试玩全攻略 第十三关 已知敌人
    【codecombat】 试玩全攻略 第十一关 再次迷宫经历
    【codecombat】 试玩全攻略 第六关 cell commentary
    【codecombat】 试玩全攻略 第八关 火舞
    【codecombat】 试玩全攻略 第十二关 恐惧之门
    【codecombat】 试玩全攻略 第十四关 已知敌人
    苹果apns推送总结
    Xcode 提升速度小技巧
    UITextField 限制输入字数
  • 原文地址:https://www.cnblogs.com/vhyc/p/6095756.html
Copyright © 2011-2022 走看看