前两天发了个帖子经过各位指点目前已经把java的socket编程的多线程已经弄出来大家群聊没有问题但是我现在发现如果要实现单对单的私聊就不知道怎么弄了以前的思路是在主进程中定义一个结构体,来保存每个客户端连接的socket句柄当A向B私聊的时候服务器看到了私聊指令就从结构体当中找到B的socket句柄来向B发送数据这是最基本的思路了但是我在java里面该如何实现呢?比如我要把用户ID,用户名,帮会ID这些存放在一个结构体当中怎么存呢另外我看到java里面有arraylist我觉得比较象结构体但在serversocket的accept之后我打印了一下数据他只有远程ip本地端口和一个端口的内容
我不知道这个端口内容为什么不对,比如我设定的端口为5000每次他会打印出来的值不一样,连接一个就不一样,而本地端口一直都是5000,因为我调试是在本机,客户端和服务端都在一起,所以不知道是不是这个原因造成的,如果不是的话我想这个端口是不是就是我要的句柄
请各位老大指点
我不知道这个端口内容为什么不对,比如我设定的端口为5000每次他会打印出来的值不一样,连接一个就不一样,而本地端口一直都是5000,因为我调试是在本机,客户端和服务端都在一起,所以不知道是不是这个原因造成的,如果不是的话我想这个端口是不是就是我要的句柄
请各位老大指点
这样你就可以和任何人通信了。
你说的很对啊
有代码吗?
14楼的朋友
我做了一个hashmap,里面保存了用户id和用户的socket
服务器如果发现是需要私聊则,在hashmap里面去检索需要接受的用户id,如果找到了则给这个socket发信息我现在的问题在找到这个socket后不知道怎么用这个socket发出去
Set<Map.Entry<String, Socket>> mySet = new NewChatServer().container.entrySet();
Iterator<Map.Entry<String, Socket>>it = mySet.iterator();
String message = userinfo[1];
while (it.hasNext()) {//如果列表中还有客户
Map.Entry<String, Socket> me = it.next();
Socket tempClient = me.getValue();
String key = me.getKey();
if(key.equals(uid)){
//问题就在这里了,找到了对方后我的temclient该怎么写能把信息发出去
}
}
java版的朋友思路都很多没有人愿意给代码啊
Socket 可以获得 OutputStream,把数据 write 进去就可以了。
你的思路不是很对吗?
发送数据首先找到接收方ID,根据ID找到Socket。
利用发送方Socket.getInputStream,保存到byte[],然后利用接收方Socket.getOutputStream().write();写入,最后Socket.getOutputStream().frush()就发送了感觉长连接,短连接都可以。
你要代码?难道就为了这代码,让别人从头写个聊天程序,来测试这段代码?你要是问算法,或者某些能直接使用 main 方法得出结果的东西,那贴代码倒无所谓,像这样的网络应用程序,除非别人正好有个跟你一模一样的东西,否则你随便到哪里去问都是不可能的,没人会贴代码!
每条消息都应该有发送者id和接收者id
服务器在处理消息的时候,通过id找到具体的socket来发送就可以了
在服务端可以把每个socket当作session来看待吧建议用Apache MINA框架
百度一下资料很多的
NIO比多线程socket好很多
MINA框架也让你摆脱网络细节,只用做好业务逻辑就ok了
就是实现基于java服务端的tcp连接的私聊
//User
import java.io.Serializable;public class User implements Serializable { private static final long serialVersionUID = 520335207752011L;
private String id;
private String name;
private int age;
public User(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return id + ":" + name + ":" + age;
}
}
//Server
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SServer { private ServerSocket server;
private Socket socket;
public SServer() {
try {
server = new ServerSocket(54321);
socket = server.accept();
SendThread st = new SendThread();
RecviceThread rt = new RecviceThread();
new Thread(st).start();
new Thread(rt).start();
} catch (IOException e) {
e.printStackTrace();
}
}
private class SendThread implements Runnable {
private ObjectOutputStream output;
private boolean isSend = true;
public SendThread() {
try {
output = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
int t = 0;
try {
while(isSend) {
User user = new User("1000" + t, "serverUser" + t, 20 + t);
output.writeObject(user);
output.flush();
t ++;
Thread.sleep((long) (Math.random()*2000));
}
}catch(Exception e) {
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private class RecviceThread implements Runnable {
private ObjectInputStream input;
private boolean isRecvice = true;
public RecviceThread() {
try {
input = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while(isRecvice) {
User user = (User)input.readObject();
System.out.println(user);
Thread.sleep((long) (Math.random()*2000));
}
}catch(Exception e) {
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String args[]) {
new SServer();
}
}
//Client
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class CClient { private Socket socket;
public CClient() {
try {
socket = new Socket("127.0.0.1", 54321);
SendThread st = new SendThread();
RecviceThread rt = new RecviceThread();
new Thread(st).start();
new Thread(rt).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class SendThread implements Runnable {
private ObjectOutputStream output;
private boolean isSend = true;
public SendThread() {
try {
output = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
int t = 0;
try {
while(isSend) {
User user = new User("1000" + t, "clientUser" + t, 20 + t);
output.writeObject(user);
output.flush();
t ++;
Thread.sleep((long) (Math.random()*2000));
}
}catch(Exception e) {
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private class RecviceThread implements Runnable {
private ObjectInputStream input;
private boolean isRecvice = true;
public RecviceThread() {
try {
input = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while(isRecvice) {
User user = (User)input.readObject();
System.out.println(user);
Thread.sleep((long) (Math.random()*2000));
}
}catch(Exception e) {
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String args[]) {
new CClient();
}
}
这个我已经测试没问题,你自己看看研究下。
一个线程发一个收
就可以你想发什么,都可以,连续发,连续接。我们这边就是采用简单的连续发,版主自己看看。