/* * 保存初识信息 * */ private String text; public ServerListener(Socket socket) { this.socket = socket; // System.out.println("Sorry"); } @Override public void run() { try { is = new BufferedReader(new InputStreamReader( socket.getInputStream())); out = new PrintWriter(socket.getOutputStream()); text = is.readLine(); System.out.println(text); Socket_ID = Integer.valueOf(new String(text.getBytes()).trim().split(",")[0]); SEND_OBJECT = new String(text.getBytes()).trim() .split(",")[1]; System.out.println(Socket_ID); Server.addSocket(Socket_ID, socket); outTo = new PrintWriter(Server.getSocket( Integer.valueOf(SEND_OBJECT)).getOutputStream()); line = is.readLine(); while (!line.equals("bye")) { outTo.write(line); outTo.flush(); Server.print("Client" + Socket_ID + ":" + line); line = is.readLine(); } } catch (IOException e) { System.out.println("Error." + e); } }}package SocketTest;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException;public class Client { public static void main(String[] args) { String SEND_OBJECT = "1"; String Client_ID = "0"; try { // 向本机的4700端口发出客户请求 Socket socket = new Socket("127.0.0.1", 4700); // 由系统标准输入设备构造BufferedReader对象 BufferedReader sin = new BufferedReader(new InputStreamReader( System.in)); // 由socket对象得到输入流,并构造PrintWriter对象 PrintWriter os = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader( socket.getInputStream())); os.println(Client_ID + "," + SEND_OBJECT); os.flush(); String readline; readline = sin.readLine(); while (!readline.equals("bye")) { os.println(readline); os.flush(); System.out.println("Client:" + readline); System.out.println("Client2:" + is.readLine()); readline = sin.readLine(); } os.close(); is.close(); socket.close(); } catch (IOException e) { System.out.println("Error" + e); } }}
报空指针异常,不知道是哪里有问题。 Exception in thread "Thread-0" java.lang.NullPointerException at SocketTest.Server.addSocket(Server.java:45) at SocketTest.ServerListener.run(ServerListener.java:60) at java.lang.Thread.run(Unknown Source)
ServerSocket server = null; 这句下面加上 instance=new Server(); 错误原因是你的sockes 没有被创建。
你好,我最近在看NIO,遇到一些问题,可以帮帮我吗?感激不尽。 Scattering Reads操作的时候,我写了一个228字节的文本,用一个ByteBuffer数组读取,header读完后输出没问题,到了下一个buffer就报BufferUnderflowException错误。 package nioTest;import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel;public class ChannelTest1 { private static ByteBuffer header; private static ByteBuffer body; private static File file; private static RandomAccessFile ra; private static FileChannel inChannel; private static long byteRead; public static void main(String[] args) { file = new File("d:" + File.separator + "text.txt"); try { ra = new RandomAccessFile(file, "rw"); inChannel = ra.getChannel(); header = ByteBuffer.allocate(128); body = ByteBuffer.allocate(1024); ByteBuffer[] bufferArray = { header, body }; byteRead = inChannel.read(bufferArray); System.out.println(byteRead); // System.out.println(header.get(dst)()); while (byteRead != -1) { header.flip(); body.flip(); while (header.hasRemaining()) { byte[] dst = new byte[128]; header.get(dst); System.out.println(new String(dst));
} header.compact(); while (body.hasRemaining()) { byte[] dst1 = new byte[128]; body.get(dst1); System.out.println(new String(dst1));
package SocketTest;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Server {
private static List<Socket> sockes = null;
private static Server instance; public Server() {
sockes = new ArrayList<Socket>();
} public static void main(String[] args) {
ServerSocket server = null; try {
server = new ServerSocket(4700);
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Cant listen to:" + e);
}
Socket socket = null;
try {
while (true) {
socket = server.accept();
Thread thread = new Thread(new ServerListener(socket));
thread.start();
System.out.println("New Thread Started");
}
} catch (IOException e) {
System.out.println("Error." + e);
}
} public static void addSocket(int position, Socket s) {
sockes.add(position, s);
}
public static void print(Object o){
System.out.println(o);
} public static Socket getSocket(int position) {
return sockes.get(position);
}}package SocketTest;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;public class ServerListener implements Runnable {
private Socket socket = null;
/*
* 用来读取客户端发送的消息
*/
private BufferedReader is = null; /*
* 用来给客户端发送消息
*/
private PrintWriter out = null; /*
* 客户端发送的消息
*/ private String line = null, SEND_OBJECT = null; /*
* 用来保存Socket线程ID
*/
public static int Socket_ID; /*
* 用来给指定的其他客户端发送消息
*/
private PrintWriter outTo;
/*
* 保存初识信息
* */
private String text; public ServerListener(Socket socket) {
this.socket = socket;
// System.out.println("Sorry");
} @Override
public void run() {
try {
is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
text = is.readLine();
System.out.println(text);
Socket_ID = Integer.valueOf(new String(text.getBytes()).trim().split(",")[0]);
SEND_OBJECT = new String(text.getBytes()).trim()
.split(",")[1];
System.out.println(Socket_ID);
Server.addSocket(Socket_ID, socket);
outTo = new PrintWriter(Server.getSocket(
Integer.valueOf(SEND_OBJECT)).getOutputStream());
line = is.readLine();
while (!line.equals("bye")) {
outTo.write(line);
outTo.flush();
Server.print("Client" + Socket_ID + ":" + line);
line = is.readLine();
}
} catch (IOException e) {
System.out.println("Error." + e);
} }}package SocketTest;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class Client { public static void main(String[] args) {
String SEND_OBJECT = "1";
String Client_ID = "0";
try {
// 向本机的4700端口发出客户请求
Socket socket = new Socket("127.0.0.1", 4700);
// 由系统标准输入设备构造BufferedReader对象
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
// 由socket对象得到输入流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream())); os.println(Client_ID + "," + SEND_OBJECT);
os.flush();
String readline;
readline = sin.readLine();
while (!readline.equals("bye")) {
os.println(readline);
os.flush();
System.out.println("Client:" + readline);
System.out.println("Client2:" + is.readLine());
readline = sin.readLine();
}
os.close();
is.close();
socket.close();
} catch (IOException e) {
System.out.println("Error" + e);
}
}}
Exception in thread "Thread-0" java.lang.NullPointerException
at SocketTest.Server.addSocket(Server.java:45)
at SocketTest.ServerListener.run(ServerListener.java:60)
at java.lang.Thread.run(Unknown Source)
这句下面加上
instance=new Server();
错误原因是你的sockes 没有被创建。
Scattering Reads操作的时候,我写了一个228字节的文本,用一个ByteBuffer数组读取,header读完后输出没问题,到了下一个buffer就报BufferUnderflowException错误。
package nioTest;import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class ChannelTest1 {
private static ByteBuffer header;
private static ByteBuffer body;
private static File file;
private static RandomAccessFile ra;
private static FileChannel inChannel;
private static long byteRead; public static void main(String[] args) {
file = new File("d:" + File.separator + "text.txt");
try {
ra = new RandomAccessFile(file, "rw");
inChannel = ra.getChannel();
header = ByteBuffer.allocate(128);
body = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
byteRead = inChannel.read(bufferArray); System.out.println(byteRead);
// System.out.println(header.get(dst)());
while (byteRead != -1) {
header.flip();
body.flip();
while (header.hasRemaining()) {
byte[] dst = new byte[128];
header.get(dst);
System.out.println(new String(dst));
}
header.compact();
while (body.hasRemaining()) {
byte[] dst1 = new byte[128];
body.get(dst1);
System.out.println(new String(dst1));
}
byteRead = inChannel.read(bufferArray);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ra.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}