[英]How to accept multiple socket connection at Java server
我正在尝试使用标准Java套接字在Android中实现客户端/服务器对。 到目前为止,我已经成功实现了一对一的客户端-服务器连接。 现在,我正在修改服务器端代码以接受多个客户端连接。 我从这里得到了帮助。 我正在创建一个serverSocket,并在无限的while循环中等待客户端连接。 一旦接受了客户端存储,我将运行一个新线程来处理该客户端,然后再次等待新的连接。 不幸的是,由于某些未知原因,该程序不断崩溃! logcat只是说-“打开跟踪文件出错:没有这样的文件或目录”。 文件路径正确(在较旧的实现中运行正常)。 谁能暗示我在做什么错? 这与缺少清单许可有关吗? 到目前为止,这是我所做的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent launchFileManager = new Intent(getBaseContext(),
FileChooserActivity.class);
startActivityForResult(launchFileManager, REQUEST_CODE); //receives files
//fileArray has been populated here
Button btn=(Button)findViewById(R.id.dispFilesid);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initializeServer();
}
});
}
private void initializeServer() {
boolean listening = true;
try {
serversocket = new ServerSocket(4444);
} catch (IOException e) {
e.printStackTrace();
Log.d("Listen failed", "Listening to port 4444 failed");
}
while (listening) {
try {
socket = serversocket.accept();
Thread Clienttrd = new Thread(new Runnable() {
@Override
public void run() {
try {
OutputStream myos=socket.getOutputStream();
myos.write(filepathNameArray.size()); //send file count
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!fileArray.isEmpty()) {
for (int i = 0; i < filepathNameArray.size(); i++){
copyFile(fileArray.get(i), fileArray.get(i).getName().toString());
//mtv.setText(fileArray.get(i).getName().toString());
}
}
}
});
Clienttrd.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileChooserActivity的意图返回一个ArrayList,其中包含文件URI的列表。 然后将这些URI包裹在文件周围,并写在Socket对象的DataOutputStream上。 请帮忙。 任何见识将不胜感激! 提前致谢!
终于解决了问题。 这可能会对将来登陆此页面的其他人有所帮助。 问题:我使用同一线程来接受和处理客户端连接。 因此,服务器无法腾出空间来监听其他传入的连接。 我编写了一个单独的ConnectionHandler类来处理客户端连接:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread trd = new Thread(new Runnable() {
@Override
public void run() {
try {
serversocket = new ServerSocket(4444);
} catch (IOException e) {
e.printStackTrace();
Log.d("Listen failed",
"Listening to port 4444 failed");
}
while (listening) {
try {
socket = serversocket.accept();
Runnable connectionHandler = new ConnectionHandler(
socket, fileArray, filepathNameArray);
new Thread(connectionHandler).start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
trd.start();
}
});
ConnectionHandler(这解决了我的问题):
public class ConnectionHandler implements Runnable {
private Socket socket=null;
private ArrayList<File> fileArray=null;
ArrayList<String> filepathNameArray=null;
public ConnectionHandler(Socket socket, ArrayList<File> fileArray, ArrayList<String> filepathNameArray) {
super();
this.socket = socket;
this.fileArray=fileArray;
this.filepathNameArray=filepathNameArray;
}
@Override
public void run() {
try {
OutputStream myos=socket.getOutputStream();
myos.write(filepathNameArray.size()); //send file count
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!fileArray.isEmpty()) {
for (int i = 0; i < filepathNameArray.size(); i++){
copyFile(fileArray.get(i), fileArray.get(i).getName().toString());
//mtv.setText(fileArray.get(i).getName().toString());
}
}
}
private void copyFile(File file, String name) {
FileInputStream fis;
long filesize = file.length();
try {
fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
@SuppressWarnings("resource")
DataInputStream dis = new DataInputStream(bis);
byte[] mybytearray = new byte[16384];
OutputStream os;
if (socket != null) {
os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(name); // filename is also sent to client
dos.writeLong(filesize); // file size is also sent to client
long z = filesize;
int n = 0;
while ((z > 0)
&& (n = dis.read(mybytearray, 0,
(int) Math.min(mybytearray.length, z))) != -1) {
dos.write(mybytearray, 0, n);
dos.flush();
z -= n;
}
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.