java socket 实现多个一对一聊天

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

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

服务器端:

packagecn.com.test09;

importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.HashMap;
importjava.util.Set;

public classt12 {

    public static voidmain(String[] args) {
        //TODO Auto-generated method stub
       new ServerOb(8080);
    }

}
classServerOb{
    private intport;
    ServerSocket ss;
    public ServerOb(intp){
        this.port=p;
        
        try{
            ss = newServerSocket(port);
        } catch(IOException e1) {
            //TODO Auto-generated catch block
e1.printStackTrace();
        }
        while(true){
            try{
                
                Socket soc =ss.accept();
                new Thread(newclientO(soc)).start();
                
            } catch(IOException e) {
                //TODO Auto-generated catch block
                System.out.println(" ServerOb 构造函数  出错");
                e.printStackTrace();
            }
        }
    }
}
class clientO implementsRunnable{
    public static HashMap<String, Socket> map= new HashMap<String, Socket>();
    private  String number = null;
    privateSocket soc;
    privateDataInputStream in;
    privateDataOutputStream out;
     publicclientO(Socket s){
      this.soc=s;
      try{
        this.in=newDataInputStream(soc.getInputStream());
        this.out=newDataOutputStream(soc.getOutputStream());
    } catch(IOException e) {
        //TODO Auto-generated catch block
e.printStackTrace();
    }
    
     getKey();
     }
     publicString getNumber(){
        
         try{
             number=in.readUTF();
        } catch(IOException e) {
            //TODO Auto-generated catch block
e.printStackTrace();
        }
        returnnumber;
     }
     public voidgetKey(){
         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 voidrun() {
        //TODO Auto-generated method stub
        
        while(true){
         getOtherNumber();
        }
        
    }
    public voidgetOtherNumber(){
        try{
            String oth =in.readUTF();
            String value =in.readUTF();
            Socket other =map.get(oth);
            String str=number +"对你说:
"+value;
            DataOutputStream asd = newDataOutputStream(other.getOutputStream());
            asd.writeUTF(str);
            asd.flush();
        } catch(IOException e) {
            //TODO Auto-generated catch block
e.printStackTrace();
        }
    }
    
    
}

客户端:

packagecn.com.test09;

importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.Socket;
importjava.net.UnknownHostException;

public classt13 {

    public static voidmain(String[] args) {
        
    new ClientOO("192.168.0.105",8080,"1");//服务器ip  服务器端口    自身编号
}

}
classClientOO{
    privateString path;
    private intport;
    privateString name;
    privateDataInputStream in;
    privateDataOutputStream out;
    public ClientOO(String path,intport,String name){
        this.path=path;
        this.port=port;
        this.name=name;
        try{
            Socket s=newSocket(path,port);
            this.in=newDataInputStream(s.getInputStream());
            this.out=newDataOutputStream(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 voidsend(){
        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  voidhhhhh(){
        newMyServerReader1(in).start();
        newMyServerWriter1(out).start();
    }
}
class MyServerReader1 extendsThread {
    privateDataInputStream dis;
    publicMyServerReader1(DataInputStream dis) {
        this.dis =dis;
    }

    public voidrun() {
        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 extendsThread {
   privateDataOutputStream dos;

    publicMyServerWriter1(DataOutputStream dos) {
        this.dos =dos;
    }

    public voidrun() {
        //读取键盘输入流
        InputStreamReader isr = newInputStreamReader(System.in);
        //封装键盘输入流
        BufferedReader br = newBufferedReader(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();
        }
    }
}

免责声明:文章转载自《java socket 实现多个一对一聊天》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用Roslyn的C#语言服务实现UML类图的自动生成Javascript原生之用cssText批量修改样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java中将字符串用空格分割成字符串数组的split方法

官方文档链接:public String[] split(String regex) 本文以空格作为分割串。 CaseOne import java.util.Scanner; public class CaseOne { public static void main(String[] args) { Scanner sc = new Scan...

php中流行的rpc框架详解

什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 我的官方群点击此处。 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现...

SharedPreferences 详解(多进程,存取数组解决方案)

一、SharedPreferences基本概念 文件保存路径:/data/data/<包名>/shared_prefs目录下目录下生成了一个SP.xml文件 SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。 实现SharedPreferences存储的步骤如下: 根据Context...

对json进行封装

项目中经常用到对于JSON的各种转换处理,保存一份,免得以后忘了。 using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Data; using System.Collections; using CR...

java代码POST方式请求SOAP

1 package com.http.soap; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.nio.charset.Charset; 7 8 impo...

php集成动态口令认证

这篇文章主要为大家详细介绍了php集成动态口令认证,动态口令采用一次一密、用过密码作废的方式来提高安全性能,感兴趣的小伙伴们可以参考一下 大多数系统目前均使用的静态密码进行身份认证登录,但由于静态密码容易被窃取,其安全性无法满足安全要求。 动态口令采用一次一密、用过密码作废的方式防止了密码被窃取带来的安全问题。动态口令分为HOTP(基于事件计数的动态口令,...