编写Android socket通信,想要服务器端向手机端发送消息,但会出现异常
每次发送第一次数据时可以成功,当之后的就会抛出异常10-3111:09:32.332:W/System.err(9570):java.io.EOFException10-...
每次发送第一次数据时可以成功,当之后的就会抛出异常
10-31 11:09:32.332: W/System.err(9570): java.io.EOFException
10-31 11:09:32.332: W/System.err(9570): at libcore.io.Streams.readFully(Streams.java:83)
10-31 11:09:32.340: W/System.err(9570): at java.io.DataInputStream.readFully(DataInputStream.java:99)
10-31 11:09:32.340: W/System.err(9570): at java.io.DataInputStream.decodeUTF(DataInputStream.java:178)
10-31 11:09:32.356: W/System.err(9570): at java.io.DataInputStream.decodeUTF(DataInputStream.java:173)
10-31 11:09:32.356: W/System.err(9570): at java.io.DataInputStream.readUTF(DataInputStream.java:169)
10-31 11:09:32.356: W/System.err(9570): at com.example.client.socket.run(socket.java:29)
我的代码是:
客户端:
try {
client_socket = new Socket("192.168.1.106",3333);
input = new DataInputStream(client_socket.getInputStream());
output = new DataOutputStream(client_socket.getOutputStream());
textString = input.readUTF();
System.out.println(textString);
textString = null;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
服务器:
try {
serversocket = new ServerSocket(3333);
System.out.println("listening 3333 port:");
String send_msg = "21.5";
while(true){
try {
Socket client_socket = serversocket.accept();
input = new DataInputStream(client_socket.getInputStream());
output = new DataOutputStream(client_socket.getOutputStream());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
try {
output.writeUTF(send_msg);
output.close();
} catch (Exception e) {
} 展开
10-31 11:09:32.332: W/System.err(9570): java.io.EOFException
10-31 11:09:32.332: W/System.err(9570): at libcore.io.Streams.readFully(Streams.java:83)
10-31 11:09:32.340: W/System.err(9570): at java.io.DataInputStream.readFully(DataInputStream.java:99)
10-31 11:09:32.340: W/System.err(9570): at java.io.DataInputStream.decodeUTF(DataInputStream.java:178)
10-31 11:09:32.356: W/System.err(9570): at java.io.DataInputStream.decodeUTF(DataInputStream.java:173)
10-31 11:09:32.356: W/System.err(9570): at java.io.DataInputStream.readUTF(DataInputStream.java:169)
10-31 11:09:32.356: W/System.err(9570): at com.example.client.socket.run(socket.java:29)
我的代码是:
客户端:
try {
client_socket = new Socket("192.168.1.106",3333);
input = new DataInputStream(client_socket.getInputStream());
output = new DataOutputStream(client_socket.getOutputStream());
textString = input.readUTF();
System.out.println(textString);
textString = null;
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
服务器:
try {
serversocket = new ServerSocket(3333);
System.out.println("listening 3333 port:");
String send_msg = "21.5";
while(true){
try {
Socket client_socket = serversocket.accept();
input = new DataInputStream(client_socket.getInputStream());
output = new DataOutputStream(client_socket.getOutputStream());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
try {
output.writeUTF(send_msg);
output.close();
} catch (Exception e) {
} 展开
展开全部
服务端的 accept 之后 要在开一个线程 和 客户端 的socket (建立单一的信道)进行通信,才能保证是长连接 双方数据可以 持续发送,你说第一次可以 那是 你 TCP 三次握手成功后,你writeUTF(send_msg),你就 又把socket关闭了,信道就断了
更多追问追答
追问
是在服务器端写个线程里面是;
output.writeUTF(send_msg);吗
追答
在服务端的那个 accept之后 就要在开一个线程(run方法里面 使用就是 读流操作 写的操作 writeUTF 可以 封装成一个方法 ) 把 client_socket对象 传到单独的线程里 , 服务端其余的保持代码 保持 你原先的,另外注意客户端 的 的读流操作(对应你的 input.readUTF()
)也要放在线程里死循环 写的操作(writeUTF)也封装成方法
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询