我在套接字编程应用程序中有“Server”的代码,我在这行代码中的以下代码的第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();
}
}
}
此代码为“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;
}
}
}
编辑:运行客户端线程的类
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();
}
}
答案 0 :(得分:1)
客户端似乎是由一个线程执行的,但只是实现Runnable
不正确,您需要创建一个Thread
并将Runnable
传递给它。客户端无法无限期执行,因此客户端完成并关闭隐式(JVM)套接字和服务器获取此异常以指示(客户端关闭套接字)。 / p>
答案 1 :(得分:1)
要避免SocketException
尝试添加wait()
或类似内容作为客户端应用中run()
方法中的最后一个语句。