这个程序是服务器端,与客户端建立了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());
}
}}
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());
}
}}
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); // 出错,打印出错信息
}
}
}
Thread t1 = new Thread(new Shop(socket));
在线程里面保存
this.socket = socket