这是Java老的Socket 编程API,你看一下新的java NIO API,里面已经用selector和监听机制了,且管道不仅仅是socket还有文件等channel类型,开发你的需求简单多了

解决方案 »

  1.   

    有朋友在吗?现在又遇到这个问题,很苦恼
    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);
    }
    }}
      

  2.   

    报空指针异常,不知道是哪里有问题。
    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)
      

  3.   

     ServerSocket server = null;
    这句下面加上
    instance=new Server();
    错误原因是你的sockes 没有被创建。
      

  4.   

    你好,我最近在看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));

    }
    byteRead = inChannel.read(bufferArray);
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    try {
    ra.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }