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();
        }
    }
}
原文地址:https://www.cnblogs.com/anholt/p/3658178.html