"java.net.SocketException: Connection reset" in my Runnable class, why?
I have this code for "Server" in socket programming application, and I have this Exception java.net.SocketException
in line 26 of the following code in this line of code:
while((line=bReader.readLine())!=null){
What is the problem causing this exception?
Server:
import java.io.BufferedReader;
import java.io.BufferedWriter;
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 Server implements Runnable{
final public int PORT=1212;
private Socket client;
private ServerSocket server;
private BufferedReader bReader;
private PrintWriter pWriter;
public void run(){
try {
System.out.println("Start server ...");
server=new ServerSocket(PORT);
while(true){
System.out.println("Start listening on PORT "+PORT+" ...");
client=server.accept();
System.out.println("Connection with client["+client.getInetAddress().getHostName()+"]");
bReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
pWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
String line="";
while((line=bReader.readLine())!=null){
RecoginzeMessage(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
client.close();
// server.close();
bReader.close();
pWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void RecoginzeMessage(String msg){
String msg_params[]=msg.split(":");
switch(Integer.parseInt(msg_params[0])){
case 0:// Authetication process
System.out.println("Authentication new client");
AuthenticateUser(msg_params[1],msg_params[2]);
break;
}
}
public void AuthenticateUser(String username, String password){
if(username.equals("adham")&&password.equals("adham")){
pWriter.println("1");
pWriter.flush();
}
else{
pWriter.println("0");
pWriter.flush();
}
}
}
and this code for "client" ..
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client implements Runnable {
public final String SERVER_IP="127.0.0.1";
public final int PORT=1212;
private Socket client;
private BufferedReader bReader;
private PrintWriter pWriter;
Scanner sc=new Scanner(System.in);
public Client(){
if(client==null)
try {
client=new Socket(SERVER_IP,PORT);
bReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
pWriter=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
} catch (UnknownHostException e) {
e.printStackTrace();
开发者_开发知识库 } catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
System.out.print("Enter username: ");
String username=sc.nextLine();
System.out.print("Enter password: ");
String password=sc.nextLine();
if(login(username,password)){
System.out.print(">logged in successfuly");
}else{
System.out.print(">Inavlied username or password");
}
}
private boolean login(String username, String password){
try{
pWriter.println("0:"+username+":"+password);
pWriter.flush();
while(true){
String line="";
while((line=bReader.readLine())!=null){
if(line.equals("1"))
return true;
else
return false;
}
}
}catch(Exception ex){
return false;
}
}
}
Edit: The class to run Client thread
public class RunClient {
public static void main(String args[]){
Client cThread=new Client();
cThread.run();
}
}
Edit: The class to run Server thread
public class RunServer {
public static void main(String args[]){
Server sThread=new Server();
sThread.run();
}
}
The client seems to be executed by a thread, but just implementing Runnable
is not correct, you need to create a Thread
and pass the Runnable
to it. The client not executes indefinitely, so the client finishes and closes implicitly (the JVM) the socket and the Server get this exception to indicate that (client closes the socket).
To avoid SocketException
try out to add wait()
or similar something as the last statement in run()
method in the client app.
精彩评论