1

我正在编写一个 p2p 文件共享程序,它将接受连接并充当服务器本身。

它正在处理中,但线路:60

套接字 sock1= tcpSocket.accept();

抛出空指针异常,我不知道出了什么问题。什么都试过了。

import java.net.*;
import java.io.*;


public class echoer implements Runnable {
    int i,backlog;
    public Socket tcpClient= null;
    public ServerSocket tcpSocket= null;
    public echoer(int tcpPort, int udpPort, int backlog) {
        try {
            this.tcpSocket = new ServerSocket(tcpPort,backlog);
            System.out.println("Server connected to "+ InetAddress.getLocalHost() + "on TCP port " + tcpPort + "and UDP port " + udpPort );
            this.backlog= backlog;
            listening();
        }
        catch (SocketTimeoutException s) {
            System.out.println("timeout");
        }
        catch (IOException ioe) {
            System.out.println("could not listen on port 10009");
            System.exit(-1);
        }
}
public echoer () {

}
void listening(){
        try {
                //i++;
                tcpSocket.getInetAddress();
                System.out.println();

                //Thread t1= new Thread((Runnable) new AcceptInput());
                //t1.start();
                //tcpSocket.accept();
                //System.out.println("Connection accepted");
                //messaging();
                Thread t2 = new Thread((Runnable) new echoer());
                t2.start();
            }
            catch (Exception e) {
                System.out.println("Cannot accept connection");
            }
        }

public void Client(String addr, int port) throws IOException 
{
    System.out.println("address= "+ addr+ "port= "+ port);
    tcpClient = new Socket(addr,port);
}
/*void messaging () {
    System.out.println("Starting Thread");
    Thread t = new Thread((Runnable) new echoer());
    t.start();
}*/
public void run() {
    while (true) {
        try {
            //System.out.println("Listening on "+ InetAddress.getLocalHost().getHostAddress() + "on TCP port " + tcpSocket.getLocalSocketAddress());
            Socket sock1= tcpSocket.accept();
            //Client(InetAddress.getLocalHost().getHostAddress(),tcpSocket.getLocalPort());
            System.out.println("Connection accepted");
            ObjectOutputStream out= new ObjectOutputStream(sock1.getOutputStream());
            //Now start the messaging thread nad pass this sock1 to tcpClient
            /*String line;
            System.out.println("Write a message");
            DataInputStream din= new DataInputStream(tcpClient.getInputStream());
            line= din.readUTF();
            if (line == null) {
                din.close();
                tcpClient.close();
                }
            System.out.println("Recvd message:" + line);*/
            if (sock1 != null) {
            tcpSocket.close();
            }
        }
        catch (IOException o) {
            System.out.println("Read Failed");
            }
        }
    }

    /*catch (IOException i) {
        System.out.println("Last statement");
    }
}*/
public static void main(String[] args) {
    new echoer(Integer.parseInt(args[0]),Integer.parseInt(args[1]),5);

}
}

 class AcceptInput implements Runnable {
    String token;
    public void run () {
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        try {
            token= br.readLine();
        if (token== "connect" ) {
            System.out.print("Enter IP address: ");
            BufferedReader ip= new BufferedReader(new InputStreamReader(System.in));
            //accept ip and port
            // pass ip and port to tcpclient socket to initiate a connection
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

4

1 回答 1

2

这是当前的问题,您调用new Thread((Runnable) new echoer())它会启动您的线程。

但是,这会调用 echoer 的空默认构造函数,其中当前没有实际代码!

因此,即使您构建了一次套接字,在您这样做之后,您只需创建一个带有所有新套接字的新 echoer 实例并调用run()

这意味着运行中的所有套接字都是空的,因为它们从未设置过,因此NullPointerException当您尝试使用它们时会通过 a 。

于 2012-10-11T01:58:26.393 回答