我正在创建两个套接字:一个客户端套接字和一个服务器套接字。
ServerSock类:
public class ServerSock {
public static void main(String args[]) throws Exception{
//creating welcome socket @param: port number
System.out.println("Server is started...");
ServerSocket serverSocket = new ServerSocket(55555);
System.out.println("Server is wating for client request...");
//creating individual sockets for clients
Socket socket0 = serverSocket.accept();
System.out.println("Client connected...");
//reading the input data
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket0.getInputStream()));
//reading the data from bufferedReader
String str = bufferedReader.readLine();
//console the data
System.out.println(" client data : " + str);
}
}
ClientSocket类:
public class ClientSocket {
public static void main(String args[]) throws Exception{
//ip address of the server
String ip = "localhost";
//port number of the application
int port = 55555;
//creating a socket
Socket socket = new Socket(ip, port);
//data to send
String data0 = "lakshan waruna";
//converting data to ByteStream param: where to send the data
OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
//writing the data
os.write(data0);
os.flush();
}
}
ServerSock
一直运行到启动客户端套接字为止。它还在ServerSock
类中打印“客户端连接”语句。但是,当它尝试使用语句String str = bufferedReader.readLine();
从bufferedReader读取数据时,它将抛出SocketException
,指出“连接重置”。我该如何解决这个问题?
答案 0 :(得分:1)
您的问题是您没有在客户端中关闭Socket
,当远程Socket
恶意关闭连接时通常会抛出“连接重置”,在这种情况下,您就不会这样做。 t呼叫Socket.close()
。如果您会注意到它会起作用,但您可能想的很好,为什么能解决此问题?为什么不只给我数据,然后下一次读取告诉我Socket
已经关闭,那就好了,但是既然您使用的是readLine()
,它会一直读取直到收到\n
或{{ 1}},或者给定的\r
在InputStream
中返回的值小于零。它几乎一直在读取,直到收到一行为止(要声明为read
之类的完整行,您是否只是在末尾添加System.out.println
),并且仍然没有找到新行,如果您在邮件末尾添加\n
会发现它也可以使用。
此外,请删除\n
,您再也不会使用它。
总是关闭袜子。
答案 1 :(得分:-2)
测试了您的代码,为我工作。
编辑错字并包含指向问题的合理信息的链接
重置的可能原因可能是套接字在发送数据之前已关闭。