Android Prise d'Exception “à la socket est fermée”
Lorsque j'essaie d'exécuter un test composé d'un écho serveur et un client android avec le code suivant, j'ai toujours l'exception msg "socket est fermée". Ce code peut simplement envoyer des msg à un serveur et recevoir des msg à partir du serveur, mais si vous voulez faire les deux en même temps, il ne fonctionne tout simplement pas... je suis très curieux de savoir pourquoi il va conduire à ce genre de problème, et comment le corriger si je veux qu'il soit en mesure d'envoyer msg serveur echo
et de recevoir des msg de serveur echo?
//Server IP address
InetAddress serverIp;
//try to connect Server
try {
//set up server IP address
serverIp = InetAddress.getByName("192.168.17.1");
//set up port
int serverPort=12345;
//initiate socket connection
Socket clientSocket=new Socket(serverIp,serverPort);
BufferedOutputStream out = new BufferedOutputStream(clientSocket.getOutputStream());
out.write("Send From Android1111, stitch ".getBytes());
out.flush();
//wait to receive Server's msg
BufferedReader br =new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
total.toString();*/
//Display received msg with Toast
Toast.makeText(getApplicationContext(), br.readLine(), Toast.LENGTH_SHORT ).show();
//close connection
clientSocket.close();
// out.close();
// out = null;
} catch (IOException e) {
//display exception with Toast
Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();
}
malheureusement, cela ne fonctionne toujours pas ...j'ai suivi vos instruction et de modifier le code pour:
//set up Server IP address
serverIp = InetAddress.getByName("192.168.2.2");
//set up Server port
int serverPort=12345;
//initiate socket connection
Socket clientSocket=new Socket(serverIp,serverPort);
//open input and output stream
OutputStream out = clientSocket.getOutputStream();
InputStream in = clientSocket.getInputStream();
//send msg
out.write("Send From Android1111, bitch ".getBytes());
//receive msg from server
byte[] buffer = new byte[in.available()];
in.read(buffer);
String rMsg = new String(buffer);
Toast.makeText(getApplicationContext(), rMsg, Toast.LENGTH_LONG ).show();
//close input and output stream
in.close();
out.close();
//關閉連線
clientSocket.close();
} catch (IOException e) {
//出錯後顯示錯誤訊息Toast
Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_SHORT).show();
}
pour l'assistant de commodité, voici le python code écrit pour la partie serveur:
# Practice Echo Server Program written in Python
import socket
# host = '' means it binds to any available interface
host = ''
port = 12345
# socket() function returns a socket object whose methods implement the various socket system calls.
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# Bind the socket to address.
s.bind((host,port))
# Listen for connections made to the socket. The backlog argument specifies
# the maximum number of queued connections and should be at least 0;
# the maximum value is system-dependent (usually 5), the minimum value is forced to 0.
s.listen(5)
# Accept a connection. The socket must be bound to an address and listening for
# connections. The return value is a pair (conn, address) where conn is a new socket
# object usable to send and receive data on the connection, and address is the address
# bound to the socket on the other end of the connection.
conn, addr = s.accept()
print 'Connected by', addr
# Receive data from the socket. The return value is a string representing the data received.
# The maximum amount of data to be received at once is specified by bufsize. See the Unix
# manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.
# Note For best match with hardware and network realities, the value of bufsize should be
# a relatively small power of 2, for example, 4096.
while 1:
data = conn.recv(1024)
if not data: break
print 'received data is : ', repr(data)
conn.send(data)
conn.close()
OriginalL'auteur shanwu | 2012-01-12
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous faites les bonnes choses dans le mauvais ordre. Peut-être que le serveur est trop rapide, et lorsque vous essayez de lire la réponse c'est déjà reçus et passés.
Suivant les règles présentées dans le tutoriel La lecture et l'Écriture sur un Socket
Voyez-vous la différence? La première ouverture d'Entrée et les flux de Sortie et ensuite lancer l'envoi de votre demande.
Je suis sûr que si vous vous en tenez à cette commande, à travailler.
Merci de ne pas poster le code de réponse. Juste mettre à jour votre question. concernant le code, vous êtes à l'aide de .disponible() qui ne fonctionne que dans certaines circonstances. Par conséquent, ne pas l'utiliser. Suffit d'utiliser l'exemple de code que j'ai aimé avec un BufferedReader et readLine().
OriginalL'auteur Robert
J'ai eu le même problème, résolu en éditant le gradle.fichier de propriétés pour permettre les connexions proxy. J'ai ajouté les lignes qui précèdent, comme expliqué sur https://github.com/facebook/react-native/issues/2726 par Nadeem Shaik
OriginalL'auteur joe mwirigi
Les besoins de vos applications INTERNET de l'autorisation dans votre AndroidManifest.xml
Qui n'a pas causé prise fermé " d'exceptions.
OriginalL'auteur Hemant