我試圖在Android中使用標準Java套接字實現客戶端 - 服務器對。到目前爲止,我已經成功實現了一對一的客戶端 - 服務器連接。現在,我正在修改我的服務器端代碼以接受多個客戶端連接。我從here獲得了幫助。我正在創建一個serverSocket並在無限的while循環中等待客戶端連接。一旦客戶端被接受,我運行一個新的線程來處理該客戶端,然後再次等待新的連接。不幸的是,該程序不斷崩潰,原因不明。 logcat簡單地說 - 「打開跟蹤文件時出錯:沒有這樣的文件或目錄」。文件路徑是正確的(它在舊版本中工作正常)。任何人都可以建議我做錯了什麼?這與缺少清單許可有關嗎?以下是我迄今所做的:如何在Java服務器上接受多個套接字連接
@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意圖返回一個包含文件URI列表的ArrayList。然後將這些URI包裝在文件中並寫入Socket對象的DataOutputStream。 請幫忙。任何有識之士將不勝感激!提前致謝!
您需要張貼堆棧跟蹤和完整的錯誤信息(並告訴我們這行是造成問題)。 –
我不知道這是否會導致您的問題,但您在這裏遇到了線程安全問題。 'listen'和'fileArray'不是線程安全的,但可能從多個線程訪問,這是一個麻煩的祕訣。 –