客户端怎么给指定的客户端发送消息,我现在是只要客户端发动的消息,连接的所有客户端都可以收到,换一种问法,也就是怎么给指定的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;
}
}