“java.net.SocketException:连接重置”在我的 Runnable 类中,为什么?
我在套接字编程应用程序中有“服务器”的代码,并且在这行代码的以下代码的第 26 行中有此异常 java.net.SocketException
:
while((line=bReader.readLine())!=null){
导致此异常的问题是什么?
服务器:
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();
}
}
}
此代码用于“客户端”..
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;
}
}
}
编辑:运行客户端线程的类
public class RunClient {
public static void main(String args[]){
Client cThread=new Client();
cThread.run();
}
}
编辑:运行服务器线程的类
public class RunServer {
public static void main(String args[]){
Server sThread=new Server();
sThread.run();
}
}
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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
客户端看起来是一个线程执行的,但是仅仅实现
Runnable
是不正确的,你需要创建一个Thread
并将Runnable
传递给它。客户端不会无限期地执行,因此客户端隐式地完成并关闭(JVM)套接字,并且服务器收到此异常以指示(客户端关闭套接字)。The client seems to be executed by a thread, but just implementing
Runnable
is not correct, you need to create aThread
and pass theRunnable
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).为了避免
SocketException
尝试添加wait()
或类似的内容,作为客户端应用程序中run()
方法中的最后一条语句。To avoid
SocketException
try out to addwait()
or similar something as the last statement inrun()
method in the client app.