【发布时间】:2016-12-19 10:14:40
【问题描述】:
我是网络编程的新手,我一直在这里寻找解决问题的方法,但找不到。我想要的是有一个可以同时从多个套接字接收文件的服务器。当服务器接受新的连接套接字时,它会使用 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 监听一个对象,但我也希望能够在对象之后接收一个大文件。这就是为什么我认为我应该使用多线程。代码如下:
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 netty.io,他们有一个 wiki 有几个示例 netty.io/wiki,用于套接字检查 telnet 或 udp。
-
“我不确定是否可以接收这样的数据,因为所有这些客户端套接字都将数据发送到此服务器上的同一端口(我猜?)” - 客户端连接到一个端口, 是的。但是它们被赋予了一个唯一的 local 端口。所以是的,您实际上可以同时从连接到同一(公共服务器)端口的许多客户端接收数据。
-
好吧,要明确一点,如果它们都在同一个客户端主机中,它们将被赋予一个唯一的本地端口,这是唯一需要唯一本地端口的时候。
-
That other answer 值得一读,如果您想了解更多关于 IP:port 唯一性的信息。
-
感谢大家的回答! :D
标签: java multithreading sockets tcp network-programming