基于C/S架构的局域网通信工具的服务器具体的设计思路应该是什么样啊?

SADSDSDDASDASD 2010-03-09 09:26:58
我们在做一个局域网的即时通信工具
GUI已经基本上完成了
但在服务器的编写上缺没办法了

我们要实现的功能是 在局域网内有一台服务器 30太客户机
客户机 发送信息到服务器 在由服务器转发到各个客户机
服务器中用到了多线程,各个客户机之间与服务器的通信互补干扰。这部分的功能我们已经基本上实现了

但我们还有一部分功能没有实现
在这个个服务器上 不但要支持 一点对多点的即时通信
还能支持点对点的 通信。
点对点 的部分该怎么办?
高手帮帮我 。。。
给一段java的实例代码启发我一下吧。。。
...全文
156 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
truediego 2010-03-09
  • 打赏
  • 举报
回复
仅限思路:

1. 客户端login
A. 服务器记录该客户端ID,以及IP
B. 客户端取得服务器端已经登录过的客户端IP,以便直接与其它客户端p2p
C. 服务器周知所有已登录过的客户端,有新的客户端登录了
2. 客户端logout
A. 服务器删除该客户端信息
B. 服务器周知所有在线客户端该客户端下线
hsf_1982 2010-03-09
  • 打赏
  • 举报
回复
从代码中能看到楼主对于Socket编程,或则说是网络通讯不是太在行。
且不说项目架构,但就最起码的通讯模型,或则说是协议栈的设计,觉得还没做好。这个是进行具体开发之前首先得要确定的。
给你个建议,首先设计一下自己平台的应用层协议,当然也可以是通讯模型吧。
说实在的,从你的代码中可以感觉到:你已经建立的模型完全没办法承载起你的需求。所以也没办法帮你修改。
SADSDSDDASDASD 2010-03-09
  • 打赏
  • 举报
回复
上面是我写的sever 现在一对多的通信已经彻底没什么问题了
谁给我加上一对一的功能
一对一的时候 是不是要有这么一个过程啊?
那就是 客户端A 有个记录自己地址 或者端口之类的信息发到服务器 之后 客户端 根据这个保留在服务器的信息找到与客户端通信的通道啊?
SADSDSDDASDASD 2010-03-09
  • 打赏
  • 举报
回复
引用 1 楼 kyo19 的回复:
可以使用Socket完成后台操作。下面是一段简单的传送代码你可以参考一下,具体的实现可以自己修改
Java codepackage demo;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.LinkedList;import java.util.List;publicclass Server {private ServerSocket ss=null;private List<Socket> list=new LinkedList<Socket>();privateclass ReceiveThreadextends Thread {private Socket socket=null;public ReceiveThread(Socket socket) {super("ReceiveThread");this.socket= socket;
}

@Overridepublicvoid run() {
InputStream in=null;
DataInputStream dis=null;while (true) {try {
sleep(50);
}catch (InterruptedException e1) {
e1.printStackTrace();
}if (socket==null|| socket.isClosed()||!socket.isConnected()) {continue;
}try {
in= socket.getInputStream();
dis=new DataInputStream(in);
String readUTF= dis.readUTF();
System.out.println("receive client message :"+ socket+""+ readUTF);
send(readUTF);
}catch (IOException e) {try {
in.close();
dis.close();
}catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}

}
}publicvoid send(String msg)throws IOException {for (int i=0; i< list.size(); i++) {
Socket groupSocket= list.get(i);
OutputStream out= groupSocket.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}publicclass AcceptSocketThreadextends Thread {public AcceptSocketThread() {super("AcceptSocketThread");
}publicvoid run() {try {
ss=new ServerSocket(7788);while (true) {
Socket socket= ss.accept();
list.add(socket);new ReceiveThread(socket).start();
}
}catch (IOException e) {
e.printStackTrace();
}

}
}privatevoid start()throws IOException {new AcceptSocketThread().start();
}publicstaticvoid main(String[] args)throws Exception {
System.out.println("Server start ....");new Server().start();
}

}Java codepackage demo;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.LinkedList;import java.util.List;publicclass Server {private ServerSocket ss=null;private List<Socket> list=new LinkedList<Socket>();privateclass ReceiveThreadextends Thread {private Socket socket=null;public ReceiveThread(Socket socket) {super("ReceiveThread");this.socket= socket;
}

@Overridepublicvoid run() {
InputStream in=null;
DataInputStream dis=null;while (true) {try {
sleep(50);
}catch (InterruptedException e1) {
e1.printStackTrace();
}if (socket==null|| socket.isClosed()||!socket.isConnected()) {continue;
}try {
in= socket.getInputStream();
dis=new DataInputStream(in);
String readUTF= dis.readUTF();
System.out.println("receive client message :"+ socket+""+ readUTF);
send(readUTF);
}catch (IOException e) {try {
in.close();
dis.close();
}catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}

}
}publicvoid send(String msg)throws IOException {for (int i=0; i< list.size(); i++) {
Socket groupSocket= list.get(i);
OutputStream out= groupSocket.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}publicclass AcceptSocketThreadextends Thread {public AcceptSocketThread() {super("AcceptSocketThread");
}publicvoid run() {try {
ss=new ServerSocket(7788);while (true) {
Socket socket= ss.accept();
list.add(socket);new ReceiveThread(socket).start();
}
}catch (IOException e) {
e.printStackTrace();
}

}
}privatevoid start()throws IOException {new AcceptSocketThread().start();
}publicstaticvoid main(String[] args)throws Exception {
System.out.println("Server start ....");new Server().start();
}

}
import java.io.*;
import java.net.*;
import java.util.*;

public class IChatServer {
private ArrayList<PrintWriter> clientaOutputStreams;

public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;

public ClientHandler(Socket clientSocket) {
try {
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch(Exception ex) {
ex.printStackTrace();
}
}

public void run() {
String message;
try {
while( (message = reader.readLine()) != null ) {
System.out.println("消息: " + message);
tellEveryone(message);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}

public static void main(String[] args) {
new IChatServer().go();
}

public void go() {
clientOutputStreams = new ArrayList<PrintWriter>();
try {
ServerSocket serverSock = new ServerSocket(6969);

while(true) {
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);

Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("收到一个连接请求.");
}
} catch(Exception ex) {
ex.printStackTrace();
}
}

public void tellEveryone(String message) {
Iterator<PrintWriter> it = clientOutputStreams.iterator();
while(it.hasNext()) {
try {
PrintWriter writer = it.next();
writer.println(message);
writer.flush();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
}
kyo19 2010-03-09
  • 打赏
  • 举报
回复
可以使用Socket完成后台操作。下面是一段简单的传送代码你可以参考一下,具体的实现可以自己修改

package demo;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

public class Server {
private ServerSocket ss = null;

private List<Socket> list = new LinkedList<Socket>();

private class ReceiveThread extends Thread {
private Socket socket = null;

public ReceiveThread(Socket socket) {
super("ReceiveThread");
this.socket = socket;
}

@Override
public void run() {
InputStream in = null;
DataInputStream dis = null;
while (true) {
try {
sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}

if (socket == null || socket.isClosed()
|| !socket.isConnected()) {
continue;
}
try {
in = socket.getInputStream();
dis = new DataInputStream(in);
String readUTF = dis.readUTF();
System.out.println("receive client message :" + socket
+ " " + readUTF);
send(readUTF);
} catch (IOException e) {
try {
in.close();
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}

}
}

public void send(String msg) throws IOException {
for (int i = 0; i < list.size(); i++) {
Socket groupSocket = list.get(i);
OutputStream out = groupSocket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}

public class AcceptSocketThread extends Thread {
public AcceptSocketThread() {
super("AcceptSocketThread");
}

public void run() {
try {
ss = new ServerSocket(7788);

while (true) {
Socket socket = ss.accept();
list.add(socket);
new ReceiveThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}

}
}

private void start() throws IOException {
new AcceptSocketThread().start();
}

public static void main(String[] args) throws Exception {
System.out.println("Server start ....");
new Server().start();
}

}

package demo;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

public class Server {
private ServerSocket ss = null;

private List<Socket> list = new LinkedList<Socket>();

private class ReceiveThread extends Thread {
private Socket socket = null;

public ReceiveThread(Socket socket) {
super("ReceiveThread");
this.socket = socket;
}

@Override
public void run() {
InputStream in = null;
DataInputStream dis = null;
while (true) {
try {
sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}

if (socket == null || socket.isClosed()
|| !socket.isConnected()) {
continue;
}
try {
in = socket.getInputStream();
dis = new DataInputStream(in);
String readUTF = dis.readUTF();
System.out.println("receive client message :" + socket
+ " " + readUTF);
send(readUTF);
} catch (IOException e) {
try {
in.close();
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}

}
}

public void send(String msg) throws IOException {
for (int i = 0; i < list.size(); i++) {
Socket groupSocket = list.get(i);
OutputStream out = groupSocket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}

public class AcceptSocketThread extends Thread {
public AcceptSocketThread() {
super("AcceptSocketThread");
}

public void run() {
try {
ss = new ServerSocket(7788);

while (true) {
Socket socket = ss.accept();
list.add(socket);
new ReceiveThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}

}
}

private void start() throws IOException {
new AcceptSocketThread().start();
}

public static void main(String[] args) throws Exception {
System.out.println("Server start ....");
new Server().start();
}

}
amt867 2010-03-09
  • 打赏
  • 举报
回复
聊天的话,建议采用 UDP,传输速度可以快一些。
SADSDSDDASDASD 2010-03-09
  • 打赏
  • 举报
回复
引用 4 楼 hsf_1982 的回复:
从代码中能看到楼主对于Socket编程,或则说是网络通讯不是太在行。
且不说项目架构,但就最起码的通讯模型,或则说是协议栈的设计,觉得还没做好。这个是进行具体开发之前首先得要确定的。
给你个建议,首先设计一下自己平台的应用层协议,当然也可以是通讯模型吧。
说实在的,从你的代码中可以感觉到:你已经建立的模型完全没办法承载起你的需求。所以也没办法帮你修改。
实话是说 我 刚学java两个多月。。。我的这个服务器是中软国际的 一个朋友写的
kyo19 2010-03-09
  • 打赏
  • 举报
回复
引用 7 楼 liguang168 的回复:
我也不知道要怎么回答你,虽然通信简单,但要做成项目,考虑的东西还挺多的。
我虽然做过两个这样的项目,但我仍然在组包(包协议)上觉得不很满意。
我在你的代码中,没有看到这些,没有看到你对Socket进行封装。
private List <Socket> list = new LinkedList <Socket>();
管理的是Socket为什么不把客户封装成一个类,管理客户。
这里面要封装的东西还很多,如果你这样子做的话,就算写出来了,恐怕会有很多问题。
我以前写的现在想起来也不怎么样,但却有上千用户在使用,还算稳定。

这段代码就是简单的Socket应用,我只是随便写一下,要做成项目是要LZ自己去做的,总不可能LZ在这发个贴我们就把代码写出来,然后LZ拿去用就行了吧,什么事还是要动脑子的
SambaGao 2010-03-09
  • 打赏
  • 举报
回复
对了。你可以想想qq的聊天室

只要客户端连到服务器上,就可以得到端口和地址。当想和某个客户端聊天时,只要单独建一个Socket就可以了.
SambaGao 2010-03-09
  • 打赏
  • 举报
回复
不管是多对一还是一对一。

多对一你也可以看成是实现了一对一。

也就是说方法是一样的。关键点在于,你以什么方式来判断服务端要采取一对一还是多对一。


liguang168 2010-03-09
  • 打赏
  • 举报
回复
我也不知道要怎么回答你,虽然通信简单,但要做成项目,考虑的东西还挺多的。
我虽然做过两个这样的项目,但我仍然在组包(包协议)上觉得不很满意。
我在你的代码中,没有看到这些,没有看到你对Socket进行封装。
private List<Socket> list = new LinkedList<Socket>();
管理的是Socket为什么不把客户封装成一个类,管理客户。
这里面要封装的东西还很多,如果你这样子做的话,就算写出来了,恐怕会有很多问题。
我以前写的现在想起来也不怎么样,但却有上千用户在使用,还算稳定。
  • 打赏
  • 举报
回复
聊天的话,建议采用 UDP,传输速度可以快一些。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧