zoukankan      html  css  js  c++  java
  • java socket 实现多个一对一聊天

    此程序能够实现同一网络下多个一对一聊天,必须服务器先启动 ,然后客户端启动并且服务器ip要填正确,并且每个客户端的自身编号必须唯一。

    服务器端:

    package cn.com.test09;
    
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Set;
    
    public class t12 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
           new ServerOb(8080);
        }
    
    }
    class ServerOb{
        private int port;
        ServerSocket ss;
        public ServerOb(int p){
            this.port=p;
            
            try {
                ss = new ServerSocket(port);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            while(true){
                try {
                    
                    Socket soc = ss.accept();
                    new Thread(new clientO(soc)).start();
                    
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    System.out.println(" ServerOb 构造函数  出错");
                    e.printStackTrace();
                }
            }
        }
    }
    class clientO implements Runnable{
        public static HashMap<String, Socket> map= new HashMap<String, Socket>();
        private  String number = null;
        private Socket soc;
        private  DataInputStream in;
        private DataOutputStream out;
         public clientO(Socket s){
          this.soc=s;
          try {
            this.in=new DataInputStream(soc.getInputStream());
            this.out=new DataOutputStream(soc.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
         getKey();
         }
         public String getNumber(){
            
             try {
                 number=in.readUTF();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return number;
         }
         public void  getKey(){
             map.put(getNumber(), soc);//得到帐号保存Map
             Set<String> ke = map.keySet();
            if(ke!=null)
             try {
                 out.writeUTF(ke.toString());
                 out.flush();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
            while(true){
             getOtherNumber();
            }
            
        }
        public void  getOtherNumber(){
            try {
                String oth = in.readUTF();
                String value = in.readUTF();
                Socket other = map.get(oth);
                String str=number +"对你说:
    "+value;
                DataOutputStream asd = new DataOutputStream(other.getOutputStream());
                asd.writeUTF(str);
                asd.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
    }

    客户端:

    package cn.com.test09;
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class t13 {
    
        public static void main(String[] args) {
            
        new ClientOO("192.168.0.105",8080,"1");//服务器ip  服务器端口    自身编号
        }
    
    }
    class  ClientOO{
        private String path;
        private int port;
        private String name;
        private  DataInputStream in;
        private DataOutputStream out;
        public ClientOO(String path,int port,String name){
            this.path=path;
            this.port=port;
            this.name=name;
            try {
                Socket s=new Socket(path,port);
                this.in=new DataInputStream(s.getInputStream());
                this.out=new DataOutputStream(s.getOutputStream());
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            send();
            
            hhhhh();
        }
        public void send(){
            String s = null;
            try {
                out.writeUTF(name);
                out.flush();
                
                
                s=in.readUTF();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("在线列表:"+s);
        }
        public  void hhhhh(){
            new  MyServerReader1(in).start();
            new MyServerWriter1(out).start();
        }
    }
    class MyServerReader1 extends Thread {
        private DataInputStream dis;
        public MyServerReader1(DataInputStream dis) {
            this.dis = dis;
        }
    
        public void run() {
            String info;
            try {
               while (true) {
                   // 如果对方,即客户端没有说话,那么就会阻塞到这里,
                    // 这里的阻塞并不会影响到其他线程
                   info = dis.readUTF();
                    // 如果状态有阻塞变为非阻塞,那么就打印接受到的信息
                   System.out.println("对方说: " + info);
                    if (info.equals("bye")) {
                        System.out.println("对方下线,程序退出!");
                       System.exit(0);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    // 从键盘获得输入流并写入信息到客户端
    class MyServerWriter1 extends Thread {
       private DataOutputStream dos;
    
        public MyServerWriter1(DataOutputStream dos) {
            this.dos = dos;
        }
    
        public void run() {
            // 读取键盘输入流
            InputStreamReader isr = new InputStreamReader(System.in);
            // 封装键盘输入流
            BufferedReader br = new BufferedReader(isr);
            String info;
            try {
                while (true) {
                    info = br.readLine();
                    dos.writeUTF(info);
                    dos.flush();
                    if (info.equals("bye")) {
                        System.out.println("自己下线,程序退出!");
                        System.exit(0);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    shell脚本中echo颜色设置
    整合Spring+Hibernate+Struts2的时候发现json数据一直无法传到页面,提示no-Session
    分页查询——Hibernate Criteria实现一次查询取得总记录数和分页后结果集
    JS,JQ 格式化小数位数
    简单地做一下“回到顶部”按钮,用jQuery实现其隐藏和显示
    二级联动,三级联动,初学者,纯javascript,不含jQuery
    Oracle数据库知识要点
    ParameterizedType理解笔记
    JDBC mysql 相关内容笔记
    在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来
  • 原文地址:https://www.cnblogs.com/anholt/p/3658178.html
Copyright © 2011-2022 走看看