[英]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.