• 使用多线程完成Socket


    public class Service {  //服务器
        
        public static void main(String[] args) {
            ServerSocket serverSocket=null;
            Socket socket=null;
            try {
                //创建一个超市
                serverSocket=new ServerSocket(8800);
                while(true){
                //超市开门 等待顾客上门购物  怎么保证超市是24消失营业的??
                 socket = serverSocket.accept();
                //使用多线程来实现多个顾客能同时购物 同时结账
                 ServiceThread thread=new ServiceThread(socket);
                  thread.start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
        }
        
        
    }
    服务器端代码
    public class ServiceThread extends Thread { 
    
        //没启动一个线程 就相当于有一个顾客 进入 超市
        Socket socket=null;
        
        public ServiceThread(Socket socket) {
            this.socket=socket;
        }
    
        @Override
        public void run() {
            InputStream is=null;
            OutputStream  os=null;
            ObjectInputStream ois=null;  //反序列化 
              try {
                  //拿出钱包,推上购物车
                is=socket.getInputStream();
                os=socket.getOutputStream();
                //反序列化 获取  顾客的信息
                ois=new ObjectInputStream(is);
                User user=(User) ois.readObject();  //读到进入超市的顾客信息
                if (user!=null) {
                    System.out.println("服务器说:您的姓名是:"+user.getUserName());
                }
                //给顾客一个回应
                os.write("欢迎您的光临".getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }finally{
                    try {
                        os.close();
                        ois.close();
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                
            }
            
            
        }
        
        
    }
    服务器需要的线程类
    public class Client1 {  //第一个顾客
    
        public static void main(String[] args) {
            Socket socket=null;
            InputStream  is=null;
            OutputStream os=null;
            ObjectOutputStream oos=null;
            //接收服务器的信息   读  
            BufferedReader  br=null;
            
            
            try {
                //进入了我们指定的  超市购物
                socket=new Socket("localhost", 8800);
                is=socket.getInputStream();
                os=socket.getOutputStream();
                //序列化对象
                oos=new ObjectOutputStream(os);
                User user=new User("小黑黑1", "admin");
                oos.writeObject(user);
                //购物完毕  shutdownOutput  与 close
                socket.shutdownOutput();
                
                //接收到服务器给你说的 欢迎光临
                br=new BufferedReader(new InputStreamReader(is));
                String  line=null;
                while((line=br.readLine())!=null){
                    System.out.println("我是客户端:服务器  对我说:"+line);
                }
                
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    br.close();
                    oos.close();
                    os.close();
                    is.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            
            
            
            
        }
    }
    客户端代码

    可是重复 创建多个 客户端的代码  让多个客户端都 启动!  服务器 会接收到每一个客户的信息!

    public class Service { // 服务器
        public static void main(String[] args) {
            DatagramPacket dp = null;  //打包 和 拆包数据 
            DatagramSocket ds = null;  // 接收和 发送数据
            //创建一个包 给客户端响应
            DatagramPacket  dpTo=null;
            try {
                byte [] buf=new byte[1024];
                //创建数据包的对象
                dp=new DatagramPacket(buf, buf.length);
                ds=new DatagramSocket(8800);
                //接收
                ds.receive(dp);
                //显示接收的信息     拆包
                String  msg=new String(dp.getData(), 0, dp.getLength());
                //获取 对方的地址   客户端的信息
                System.out.println(dp.getAddress().getHostAddress()+"说====:"+msg);
                
                //回复给 客户端
                byte[]  reply="您好!航母已经发货!".getBytes();
                // dp就是从客户端传来的信封    信封上肯定有 寄件人的地址
                SocketAddress address=dp.getSocketAddress();
                //打包成功
                dpTo=new DatagramPacket(reply, reply.length,address);
                //发送
                ds.send(dpTo);
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
    
        }
    
    }
    基于UDP的客服端代码
    public class Client {    //客户端
        public static void main(String[] args) {
            DatagramPacket dp = null;  //打包 和 拆包数据 
            DatagramSocket ds = null;  // 接收和 发送数据
            //创建一个包 给服务器响应
            DatagramPacket  dpTo=null;
            InetAddress address=null;
            try {
                //你在网上购物  要不要给客服 说你的地址
                byte[]  say="买个航空母舰!".getBytes();
                //获取本机的地址!
                address = InetAddress.getByName("localhost");
                //打包
                dp=new DatagramPacket(say, say.length,address,8800);
                //发送
                ds=new DatagramSocket();
                ds.send(dp);
                
                //接收
                byte [] buf=new byte[1024];
                dpTo=new DatagramPacket(buf, buf.length);
                ds.receive(dpTo);
                //我们看客服给我们回复了 什么     拆包
                String reply=new String(dpTo.getData(),0,dpTo.getLength());
                System.out.println(dpTo.getAddress().getHostAddress()+"说===》"+reply);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
            
        }
    
    }
    基于UDP的顾客端代码
  • 相关阅读:
    UVA11174村民排队问题
    UVA11174村民排队问题
    UVA11137(立方数之和)
    UVA11137(立方数之和)
    UVA11134传说中的车(放棋子)
    UVA11134传说中的车(放棋子)
    UVA11100旅行(大包装小包,问最少多少个包)
    UVA11100旅行(大包装小包,问最少多少个包)
    UVA11078开放式学分制(前面-后面的最大值)
    UVA11078开放式学分制(前面-后面的最大值)
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7093956.html
Copyright © 2020-2023  润新知