这个程序是服务器端,与客户端建立了socket连接后,我想利用线程再对客户端读数据,但是在所标示的地方出现
Exception in thread "Thread-0" java.lang.NullPointerException
at Shop.run(Shop.java:71)
at java.lang.Thread.run(Unknown Source)我不是很明白,难道在一个方法里建立了连接后,那个socket不能在另外一个方法中利用输入输出了吗?import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;public class Shop implements Runnable
{
ServerSocket server = null;
Socket socket = null;
PrintWriter writer = null;
ArrayList<Weapon> al;
int WeaponId;

public Shop()
{
al = new ArrayList<Weapon>();
}

public static void main(String[] args)
{
Shop shop = new Shop();
shop.addWeapon(1,"AK47","$2500");
shop.addWeapon(2,"M4a1","$3100");
shop.addWeapon(3,"AWP","$4750");
shop.trade();
}

public void trade()
{

try {
server = new ServerSocket(5000);
} catch (IOException e) {
e.printStackTrace();
}

while(true)
{
try {
socket = server.accept();
} catch (IOException e) {
e.printStackTrace();
}

String message = "欢迎来到游戏装备商店,下面是本商店提供的武器";
String message1 = "输入你需要的武器ID,按回车后购买";
try {
writer = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}

this.showWeapon();
writer.println(message);
writer.println(message1);
writer.flush();

Thread t1 = new Thread(new Shop());
t1.start();
}
}

public void run()
{
try 
{
InputStreamReader input = new InputStreamReader(socket.getInputStream()); //
BufferedReader reader = new BufferedReader(input);     //运行这2行代码出现问题
while(true)
{
String wid=reader.readLine();
WeaponId = Integer.parseInt(wid);
al.remove(WeaponId);
this.showWeapon();

if(WeaponId == 0)
{
break;
}
}

catch (IOException e) 
{
e.printStackTrace();
}

}

public void addWeapon(int id,String name,String price)
{
al.add(new Weapon(id,name,price));
}

public void showWeapon()
{
Iterator it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}}

解决方案 »

  1.   

    猜想是socket.getInputStream()没有获得到流对象。
      

  2.   

    package twenty;import java.io.*;
    import java.net.*;public class TalkClient {
    public static void main(String args[]) {
    try {
    Socket socket = new Socket("127.0.0.1", 6666);
    // 向本机的4700端口发出客户请求
    BufferedReader sin = new BufferedReader(new InputStreamReader(
    System.in));
    // 由系统标准输入设备构造BufferedReader对象
    PrintWriter os = new PrintWriter(socket.getOutputStream());
    // 由Socket对象得到输出流,并构造PrintWriter对象
    BufferedReader is = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    // 由Socket对象得到输入流,并构造相应的BufferedReader对象
    String readline="";
    String t="";
    System.out.println("请输入信息:-当输入bye时退出");
    //readline = sin.readLine(); // 从系统标准输入读入一字符串
    while(!readline.equals("bye")||!t.equals("bye")) {// 若从标准输入读入的字符串为 "bye"则停止循环
    readline=sin.readLine();

    os.println(readline);// 将从系统标准输入读入的字符串输出到Server
    os.flush();// 刷新输出流,使Server马上收到该字符串
    System.out.println("Client:" + readline);// 在系统标准输出上打印读入的字符串
    System.out.println("等待接收服务器传来的信息......");
    //String t = is.readLine();
    if (readline.equals("bye")) {
    break;
    }
    t=is.readLine();
    System.out.println("Server:" + t);// 从Server读入一字符串,并打印到标准输出上
    if(t.equals("bye")){
    break;
    }
    System.out.println("请输入信息:-当输入时bye退出"); //readline = sin.readLine(); // 从系统标准输入读入一字符串
    } // 继续循环
    os.close(); // 关闭Socket输出流
    is.close(); // 关闭Socket输入流
    socket.close(); // 关闭Socket
    } catch (Exception e) {
    System.out.println("Error" + e); // 出错,则打印出错信息
    }
    }
    }
    第二、
    package twenty;import java.io.*;
    import java.net.*;//import java.applet.Applet;public class TalkServer {
    public static void main(String args[]) {
    try {
    ServerSocket server = null;
    try {
    server = new ServerSocket(4700);
    // 创建一个ServerSocket在端口4700监听客户请求
    } catch (Exception e) {
    System.out.println("can not listen to:" + e);// 出错,打印出错信息
    System.exit(0); } Socket socket = null;
    try {
    System.out.println("等待接收客户传来的信息......");
    socket = server.accept();
    // 使用accept()阻塞等待客户请求,有客户
    // 请求到来则产生一个Socket对象,并继续执行
    } catch (Exception e) {
    System.out.println("Error." + e);// 出错,打印出错信息 }
    String line;
    BufferedReader is = new BufferedReader(new InputStreamReader(socket
    .getInputStream()));
    // 由Socket对象得到输入流,并构造相应的BufferedReader对象
    PrintWriter os = new PrintWriter(socket.getOutputStream());
    // 由Socket对象得到输出流,并构造PrintWriter对象
    BufferedReader sin = new BufferedReader(new InputStreamReader(
    System.in));
    // 由系统标准输入设备构造BufferedReader对象
    String m = is.readLine();
    if (m == null) {
    System.exit(0);
    }
    System.out.println("Client:" + m);
    System.out.println("请输入信息:-当输入bye退出");
    // 在标准输出上打印从客户端读入的字符串
    line = sin.readLine();
    // 从标准输入读入一字符串
    while (!line.equals("bye")) {
    // 如果该字符串为 "bye",则停止循环
    os.println(line);
    // 向客户端输出该字符串
    os.flush();
    // 刷新输出流,使Client马上收到该字符串
    System.out.println("Server:" + line);
    // 在系统标准输出上打印读入的字符串
    System.out.println("等待接收客户传来的信息......");
    String t = is.readLine();
    if (t == null) {
    System.exit(0);
    } else {
    System.out.println("Client:" + t);
    // 从Client读入一字符串,并打印到标准输出上
    System.out.println("请输入信息:-当输入bye退出"); line = sin.readLine();
    } // 从系统标准输入读入一字符串
    } // 继续循环
    os.close(); // 关闭Socket输出流
    is.close(); // 关闭Socket输入流
    socket.close(); // 关闭Socket
    server.close(); // 关闭ServerSocket
    } catch (Exception e) {
    System.out.println("Error:" + e); // 出错,打印出错信息
    }
    }
    }
      

  3.   

    Thread t1 = new Thread(new Shop());在新线程里面,并没有对socket进行初始化啊,一般这样用
    Thread t1 = new Thread(new Shop(socket));
    在线程里面保存
    this.socket = socket