a179583637 2016-08-02 11:03 采纳率: 0%
浏览 1070

关于android怎么一对一聊天

客户端怎么给指定的客户端发送消息,我现在是只要客户端发动的消息,连接的所有客户端都可以收到,换一种问法,也就是怎么给指定的Socket发送消息(怎么给Socket进行唯一的标识)

我的android代码就不写了,就是普通的发送消息和接收消息

下面是我服务端代码
public class SocketListener extends Thread {
Socket s;
// 该线程所处理的Socket所对应的输入流
BufferedReader br = null;
// 定义保存所有Socket的ArrayList
public static ArrayList socketList
= new ArrayList();
public static ArrayList useridList=new ArrayList();
@Override
public void run() {
System.out.print("Socket线程启动成功");
try{
ServerSocket ss = new ServerSocket(30000);
while(true)
{
// 此行代码会阻塞,将一直等待别人的连接
s = ss.accept();

        socketList.add(s);
        // 每当客户端连接后启动一条ServerThread线程为该客户端服务
        new Thread(new ServerThread(s)).start();
    }
    }catch (IOException e) {
        System.out.println("客户端连接出错");
    }

}
// 定义读取客户端数据的方法
private String readFromClient()
{

    try
    {
        return br.readLine();
    }
    // 如果捕捉到异常,表明该Socket对应的客户端已经关闭
    catch (IOException e)
    {
        e.printStackTrace();
        // 删除该Socket。
        SocketListener.socketList.remove(s);  // ①
    }
    return null;
}

}

package socket;
import java.io.*;
import java.net.*;
import java.util.*;

// 负责处理每个线程通信的线程类
public class ServerThread implements Runnable
{
// 定义当前线程所处理的Socket
Socket s = null;
// 该线程所处理的Socket所对应的输入流
BufferedReader br = null;
public ServerThread(Socket s)
throws IOException
{
this.s = s;
// 初始化该Socket对应的输入流
br = new BufferedReader(new InputStreamReader(
s.getInputStream() , "utf-8")); // ②
}
public void run()
{
try
{
String content = null;
// 采用循环不断从Socket中读取客户端发送过来的数据
while ((content = readFromClient()) != null)
{
System.out.println(s.getInetAddress()+":"+content);

int begin = content.indexOf("<");

int end = content.indexOf(">");

if (begin > -1 && end > -1) {

String name = content.substring(begin, end + 1);
System.out.println("将要发送给:"+name);
String message=content.substring(end+1);
// 遍历socketList中的每个Socket,将读到的内容向每个Socket发送一次
for (Iterator it = SocketListener.socketList.iterator(); it.hasNext(); )
{
Socket s = it.next();
try{

                    OutputStream os = s.getOutputStream();
                    os.write((message + "\n").getBytes("utf-8"));
                }
                catch(SocketException e)
                {
                    System.out.print("转发出错");
                    e.printStackTrace();
                    // 删除该Socket。
                    it.remove();
                    System.out.println(SocketListener.socketList);
                }
            }
            }
        }

    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}
// 定义读取客户端数据的方法
private String readFromClient()
{
    try
    {
        return br.readLine();
    }
    // 如果捕捉到异常,表明该Socket对应的客户端已经关闭
    catch (IOException e)
    {
        e.printStackTrace();
        // 删除该Socket。
        SocketListener.socketList.remove(s);  // ①
    }
    return null;
}

}

  • 写回答

4条回答 默认 最新

  • devmiao 2016-08-02 11:19
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能