android socket closed,Android Socket Exception “socket is closed”

问题

When I try to run a test composed of an echo server and an android client with the following code, I always get the exception msg "socket is closed". This code can simply send msg to server, and receive msg from server, but if you want to do both at the same time, it just doesn't work... I am very curious why it will lead to this kind of problem, and how should I fix it if I want it to be able to first send msg to echo server

and then receive msg from echo server?

// 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();

}

unfortunately, it still doesn't work ...I followed your instruction and modify the code to:

// 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();

}

for helper's convenience, here's the python written code for server part:

# 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()

回答1:

I assume you are doing the right things in the wrong order. May be the server is too fast and when you are trying to read the response it is already received and gone.

Following the rules presented in the tutorial Reading from and Writing to a Socket

Open a socket

Open an input stream and output stream to the socket.

Read from and write to the stream according to the server's protocol.

Close the streams.

Close the socket.

Do you see the difference? First open Input and Output stream and then start sending your request.

I am sure that if you stick to this order it will work.

回答2:

I had a similar issue, solved it by editing the gradle.properties file to allow for proxy connections. I added the foregoing lines as explained on https://github.com/facebook/react-native/issues/2726 by Nadeem Shaik

systemProp.http.proxyHost=proxyHost

systemProp.http.proxyPort=proxyPort

systemProp.https.proxyHost=proxyHost

systemProp.https.proxyPort=proxyPort

回答3:

Your application needs INTERNET permission in your AndroidManifest.xml

来源:https://stackoverflow.com/questions/8839019/android-socket-exception-socket-is-closed

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值