我正在开发一款需要在您的 PC 和 Android 之间交换消息的游戏。PC(192.168.2.104)和安卓(192.168.2.160)连接到同一个路由器,但不能互通消息。我可以使用 VM 运行它,但不能使用智能手机,连接超时并且应用程序停止。使用的版本是 Android 和 Windows 7 PC 的 2.3.4。这是关于连接的Android代码:
public class Connetti extends Activity {
EditText txtIp;
EditText txtNick;
TextView lblConferma;
Button btnConnetti;
static String serverIp;
static String nickname;
Socket socket = null;
DataOutputStream dataOutputStream = null;
public static String getIp(){
return serverIp;
}
public static String getNick(){
return nickname;
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* fullscreen */
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.connetti);
/* gui */
txtIp= (EditText)findViewById(R.id.txtIp);
txtNick= (EditText)findViewById(R.id.txtNick);
btnConnetti=(Button)findViewById(R.id.btnConnetti);
btnConnetti.setOnClickListener(btnConnettiOnClickListener);
lblConferma = (TextView)findViewById(R.id.lblConferma);
}
Button.OnClickListener btnConnettiOnClickListener= new Button.OnClickListener(){
/* imposta le azioni al click del bottone */
public void onClick(View arg0) {
btnConnetti.setClickable(false);
/* viene salvato come stringa il contenuto dell'area di testo */
serverIp=txtIp.getText().toString();
nickname=txtNick.getText().toString();
/* imposta una stringa nell'area dedicata al messaggio di conferma */
lblConferma.setText("In attesa che l'host avvii la partita...");
/* Inizio Connessione */
try {
/* imposta la connessione verso un certo IP, tramite la porta 8888 */
socket = new Socket(""+serverIp, 8888);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
/* invia il nickname del giocatore al pc */
dataOutputStream.writeUTF(nickname);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
/* chiude connessione e rimuove le strutture dati per l'I/O in uscita*/
if (socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return;
}
};}
这是在 PC 上监听的线程代码:
public class ThreadConnection extends Thread{
JTextArea textGiocatore;
int maxGiocatore = 6;
public InetAddress[] arrayGiocatore = new InetAddress [maxGiocatore];
int contaGiocatore = 0;
InetAddress indirizzo;
String nome;
int i=0;
boolean ctrlFlag=false;
String eol=System.getProperty("line.separator");
//int porta=8888;
public FileWriter fileIndirizzi;
public ThreadConnection(JTextArea textGiocatore){
this.textGiocatore=textGiocatore;
}
public void creaGiocatore(int contaGiocatore, String nome, InetAddress indirizzo,FileWriter fileIndirizzi){
try {
fileIndirizzi.append(nome+eol);
fileIndirizzi.append(indirizzo.getHostAddress()+eol);
fileIndirizzi.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
textGiocatore.append("Nome del giocatore "+contaGiocatore+": "+nome+eol);
textGiocatore.append("IP di "+nome+": "+indirizzo.getHostAddress()+eol); //se qualcosa non funziona guarda qua, indirizzo potrebbe dare problemi
textGiocatore.append("_________________________________"+eol);
}
public void run(){
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
// DataOutputStream dataOutputStream = null;
/* apertura di una connessione verso la porta 8888 */
try {
serverSocket = new ServerSocket(8888);
//textArea.append("Listening :8888"+eol);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* creazione file in scrittura (INUTILE) */
try{
fileIndirizzi = new FileWriter("fileIndirizzi.txt");
}
catch (IOException e) {
textGiocatore.append("Errore: " + e + eol);
System.exit(1);
}
while(true){
try {
/* attesa di una connessione in entrata nella porta aperta in precedenza */
textGiocatore.append("In attesa di giocatori sulla porta "+8888+eol);
socket = serverSocket.accept();
/* creazione strutture dati per I/O */
dataInputStream = new DataInputStream(socket.getInputStream());
// dataOutputStream = new DataOutputStream(socket.getOutputStream());
/* ottenimento IP del cellulare connesso */
indirizzo=socket.getInetAddress();
nome=dataInputStream.readUTF();
/* inserimento e controllo degli IP nella combo box */
if(contaGiocatore==0){
arrayGiocatore[contaGiocatore]=indirizzo;
creaGiocatore(contaGiocatore, nome, indirizzo, fileIndirizzi);
contaGiocatore++;
}
else{
ctrlFlag=false;
for(i=0; i<contaGiocatore; i++){
if((indirizzo.equals(arrayGiocatore[i])==true)){
ctrlFlag=true;
}
}
/* se questo flag è falso significa che l'IP non è presente nella combo box
* e quindi viene inserito questo item
*/
if(ctrlFlag==false){
arrayGiocatore[contaGiocatore]=indirizzo;
creaGiocatore(contaGiocatore, nome, indirizzo, fileIndirizzi);
contaGiocatore++;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if ( fileIndirizzi != null)
try {
fileIndirizzi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/* vengono chiuse la connessione e le strutture dati per l'I/O */
if( socket!= null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if( dataInputStream!= null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* if( dataOutputStream!= null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} */
}
}
}}
Eclipse 不报告错误,并且使用 VM 一切正常。