服务器端正常接收,但是客户端报socket is closed ,求解!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器端正常接收,但是客户端报socket is closed ,求解!!!相关的知识,希望对你有一定的参考价值。

Server:
package com.eshore.itsm.socket;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo

/**
* 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,
* 而后才可以向客户端发送信息,否则将会有运行时出错。
* @param args
*/
public static void main(String[] args)
ServerSocket ss = null;
try
ss = new ServerSocket(8888);
//服务器接收到客户端的数据后,创建与此客户端对话的Socket
Socket socket = ss.accept();
//用于向客户端发送数据的输出流
OutputStreamWriter dos = new OutputStreamWriter(socket.getOutputStream());
PrintWriter pw = new PrintWriter(dos);
//用于接收客户端发来的数据的输入流
InputStreamReader dis = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(dis);
System.out.println("服务器接收到客户端的连接请求:" + br.readLine());
//服务器向客户端发送连接成功确认信息
pw.println("接受连接请求,连接成功!");
pw.flush();
pw.close();
//不需要继续使用此连接时,关闭连接
socket.close();
ss.close();
catch (IOException e)
e.printStackTrace();




Client:
package com.eshore.itsm.socket;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientDemo

/**
* @param args
*/
public static void main(String[] args)
Socket socket = null;
try
socket = new Socket("localhost",8888);
//获取输出流,用于客户端向服务器端发送数据
OutputStreamWriter dos = new OutputStreamWriter(socket.getOutputStream());
PrintWriter pw = new PrintWriter(dos);
//获取输入流,用于接收服务器端发送来的数据
InputStreamReader dis = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(dis);
//客户端向服务器端发送数据
pw.println("我是客户端,请求连接!");
pw.flush();
pw.close();
//打印出从服务器端接收到的数据
System.out.println(br.readLine());
//不需要继续使用此连接时,记得关闭哦
socket.close();
catch (UnknownHostException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();



参考技术A 你服务器端只执行了一次监听,然后给close掉了。
你需要写个死循环让他一直监听下去,直到用某个指令来结束为止。
建议在百度用《java socket server》来搜索一下例子,多看看。追问

服务端基础类

参考技术B pw.close();
//不需要继续使用此连接时,关闭连接
socket.close();
ss.close();
你都把它关闭了,怎么可能不报错追问

//服务器向客户端发送连接成功确认信息
pw.println("接受连接请求,连接成功!");
pw.flush();
pw.close();
//不需要继续使用此连接时,关闭连接
socket.close();
ss.close();
我是在写完之后才关闭的哦。

追答

第一次的发送接收到了没有?

追问

服务端收到了客户端发的信息,但是客户端收不到服务端返回的消息。

追答

pw.close 放在接收完毕后再关闭

追问

服务端? 我怎么知道什么时候是接收完毕? 我实现flush再close的哦。

追答

客户端
读取到值就是接收完了
BufferedReader br = new BufferedReader(dis);
//客户端向服务器端发送数据
pw.println("我是客户端,请求连接!");
System.out.println(br.readLine());
pw.flush();
pw.close();
//打印出从服务器端接收到的数据
//不需要继续使用此连接时,记得关闭哦
socket.close();

追问

为什么一定要放在readLine之后关闭呢? 可否解释下?
试了是可以的。

追答

这是底层的原理,你客户端把发送流关闭了,服务器知道你不发送后那他也把发送的关闭了,
你客户端关闭发送了,服务器当然也关闭了

本回答被提问者采纳
参考技术C 检查下客户端是否禁止socket代理! 参考技术D 看看是不是防火墙惹得祸!

Socket编程,为啥客户端无法接收来自服务器的数据?

参考技术A 如题,我写了段Socket服务器\客户端通讯的程序,服务端能接收到客户端的数据,但是客户端就无法接收到服务端传回的数据,代码如下Server端import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * @author Think * */ public class SocketServer /** * @param args */ public static void main(String[] args) new SocketServer().start(); public void start() try ServerSocket server = new ServerSocket(10086); while(true) System.out.println("Waiting for a client..."); Socket client = server.accept(); new SocketServerThread(client).start(); catch (IOException e) e.printStackTrace(); class SocketServerThread extends Thread Socket client = null; public SocketServerThread(Socket client) this.client = client; @Override public void run() try // 得到CLIENT的输入流,从输入流出取出传输的数据 BufferedReader reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; System.out.print("from client message:"); while((line = reader_from_client.readLine()) != null) System.out.println(line); // 得到CLIENT端的输入流,通过向CLIENT传输数据 PrintWriter writer_to_client = new PrintWriter(client.getOutputStream()); writer_to_client.println("Ok"); writer_to_client.flush(); reader_from_client.close(); writer_to_client.close(); client.close(); catch (IOException e) Clientimport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; /** * @author Think * */ public class SocketClient /** * @param args */ public static void main(String[] args) try Socket remoteServer = new Socket(InetAddress.getLocalHost(), 10086); // 得到SERVER端SOCKET的输出流,通过向输出流写入数据,与SERVER进行通信 PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true); write_to_server.write("Hello, what's you name?"); write_to_server.flush(); // 把下面这几行放开,SERVER端就收不到数据了,一直处于阻塞状态 // 得到SERVER端的输出流,从输出流中读取从SERVER传递来的数据 // BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); // String line = null; // while((line = reader_from_server.readLine()) != null) // System.out.println(line); // // reader_from_server.close(); write_to_server.close(); remoteServer.close(); catch (IOException e) e.printStackTrace(); 如果Client中的说明,只要是Client中放开了BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); String line = null; while((line = reader_from_server.readLine()) != null) System.out.println(line); reader_from_server.close(); 这段代码,SERVER就阻塞在while((line = reader_from_client.readLine()) != null) 这行,不知道是哪个环节理解或处理错了,还望大家指点指点!即使不关闭连接,也是取不到数据,看了下其它类似的提问,问题在于readLine()会导致阻塞,还在摸索解决的办法! 问题补充:wgy_superpower 写道第一:Socket编程时,永远不要在关闭写(writer)之前关闭读(reader)第二:不管是客户端还是服务端在通过Socket读取数据的时候,在你的数据传输完成后,发送一个结束标记(比如:end),这样在你的 while循环里面判断一下数据是否已经传输完毕,完毕后跳出循环,否则由于你的程序就会一直阻塞在 readLine()这里,因为你的 socket还没有断开,会一直等待你写数据。你说的有道理,经过后来的试验,确实是因为readLine()一直等待着客户端的输入,但此时客户端也在等待服务端的返回,所以导致两边都在那等待,就阻塞了。一句话就是,一直【等待写数据】,但又没有数据写入,所以就卡住了。 问题补充:anranran 写道SocketServer : while((line = reader_from_client.readLine()) != null)这个在socket没有关闭的时候是无法输出来的。所以Server do not send any data to client嗯,也有道理,但主要不是socket没有关闭,而是没有向流中写数据,而readLine()又一直在那读取,所以就阻塞了!本回答被提问者采纳

以上是关于服务器端正常接收,但是客户端报socket is closed ,求解!!!的主要内容,如果未能解决你的问题,请参考以下文章

java服务器端用传输给客户端文件流(fileinputstream),客户端应该如何接收?(socket )

java socket技术 客户端实现不发送请求给服务端但是一直接收服务端发来的数据

发送和接收 Socket 数据报

TCP socket调试工具怎么建虚拟接收端

com.jcraft.jsch.JSchException: connection is closed by foreign host

Python工程师Java之路(v)Socket极简代码