使用多线程完成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(); } } }
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(); } } }