我是网络编程的新手,我一直在寻找解决方案来解决我的问题,但找不到一个。我想要的是有一台服务器可以同时接收来自多个套接字的文件。当服务器接受新的连接套接字时,它会用ClientThread类包装该套接字。以下是代码:一次接收来自多个套接字的数据(多线程)
public class Server extends Thread {
private ServerSocket server;
private Vector<ClientThread> clients;
@Override
public void run() {
listen();
}
private void listen() {
new Thread("Listening Thread") {
@Override
public void run() {
while (true) {
try {
Socket socket = server.accept();
ClientThread newClient = new ClientThread(socket);
newClient.start();
clients.addElement(newClient);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}.start();
}
ClientThread是Server类中的私有类。它总是从ObjectInputStream监听Object,但我希望能够在对象之后接收到一个大文件。这就是为什么我认为我应该使用多线程。下面是代码:(?我猜)
private class ClientThread extends Thread {
public Socket socket;
private boolean loggedIn;
private ObjectInputStream ois;
private BufferedInputStream bis;
public ClientThread(Socket socket) {
this.socket = socket;
loggedIn = true;
InputStream is = socket.getInputStream();
ois = new ObjectInputStream(is);
bis = new BufferedInputStream(is);
}
@Override
public void run() {
receive();
}
private void receive() {
while (loggedIn) {
try {
// this method blocks i guess
Object object = ois.readObject();
// after the object comes the large file
byte[] bytes = new byte[SOME_SIZE];
int bytesRead;
int totalRead = 0;
// reading the large file into memory
while ((bytesRead = bis.read(bytes, totalRead, bytes.length - totalRead)) > -1) {
totalRead += bytesRead;
}
// rest of the code for handling received bytes.......
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
}
我不知道如果接受这样的数据,因为所有这些客户端套接字在此服务器上发送数据到同一个端口,甚至有可能。如果客户端同时发送数据,服务器需要知道哪个数据是针对哪个客户端的。这已经被照顾了,或者我需要完全不同的方法吗?
我不知道这是一个愚蠢的问题,但就像我说我刚刚开始学习这些东西。另外我无法测试我的程序,因为我甚至没有客户端的代码。只是想确保我一开始就不会出错。如果这是错误的,随时发表一些想法。 :) 谢谢!
去年我添加了一个类似的请求,我最终使用Netty http://netty.io/,并且他们有一个wiki,其中有几个例子http://netty.io/wiki/,用于socket检查telnet或者可能UDP。 – Deceiver
“我不确定是否可以接收这样的数据,因为所有这些客户端套接字都将数据发送到此服务器上的同一端口(我猜?)” - 客户端连接到一个单一端口,是的。但他们有一个独特的**本地**端口。所以,是的,您实际上可以同时从连接到同一个(公共服务器)端口的许多客户端接收数据。 – Fildor
好,清楚的是,如果它们都在同一个客户端主机中,它们将被赋予一个唯一的本地端口,这是唯一需要唯一本地端口的时间。 – EJP