多客户端。java socket 服务端 怎样将发送和接收数据分开写(多线程),并且判断客户端是否连接或者断开。

解决方案 »

  1.   

    在服务端为每个客户端开一个线程,对客户端的信息进行转发,如果你不是用的NIO,发送和接收数据分开不了,都是阻塞的操作
      

  2.   

    lz 打算用长连接还是短连接?
    短连接的话,C给S发一句话,S回个"收到"的消息然后断开。 另外,需要一个类似SessionID的东西,来确定C是哪个。长连接的话,长时间开着吧,处理好交互,不过 这种方式比较占资源。
      

  3.   

    package socket;import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.*;// Referenced classes of package socket:
    //            Getdata, WriteIpPortpublic class PooledConnectHandler implements Runnable {
    public static List<Socket> list = new ArrayList<Socket>(); protected static Socket connection; protected static String ordertype; protected static String msgdata; protected static List pool = new LinkedList(); public PooledConnectHandler() {
    } public void handleConnection() { if (ordertype.equals("GET")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    pw.println("Start data transfer.");
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    if (d.equals(":531A") || d.equals("530A")) {
    d = "";
    }
    if (d.length() == 65) {
    if (Getdata.getdata1(d)) {
    pw.println("Stop data transfer.");
    }
    d = "";
    }
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (ordertype.equals("ON")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    pw.println(msgdata);
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    if (!d.equals(":510B")) {
    d.equals(":520B");
    }
    }
    } catch (FileNotFoundException filenotfoundexception) {
    } catch (IOException ioexception) {
    }
    }
    if (ordertype.equals("OFF")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    pw.println(msgdata);
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    if (!d.equals(":510A")) {
    d.equals(":520A");
    }
    }
    } catch (FileNotFoundException filenotfoundexception1) {
    } catch (IOException ioexception1) {
    }
    }
    if (ordertype.equals("SEARCH")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    pw.println("Machine No.");
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    if (d.length() == 7) {
    System.out.print(d);
    if (d.substring(0, 3).equals(":5E")) {
    if (WriteIpPort.saveip(connection.getInetAddress()
    .toString(), connection.getPort(), d
    .substring(3, 7))) {
    System.out
    .print("\u5BA2\u6237\u7AEF\u5730\u5740\u5DF2\u7ECF\u4FDD\u5B58\u5230\u6570\u636E\u5E93");
    } else {
    System.out
    .print("\u5BA2\u6237\u7AEF\u5730\u5740\u4FDD\u5B58\u5931\u8D25");
    }
    d = "";
    }
    }
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (ordertype.equals("SET")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    pw.println((new StringBuilder("P_SET:")).append(msgdata)
    .toString());
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    d.equals(":5F00");
    }
    } catch (FileNotFoundException filenotfoundexception2) {
    } catch (IOException ioexception2) {
    }
    }
    if (ordertype.equals("")) {
    try {
    BufferedReader buff = new BufferedReader(new InputStreamReader(
    connection.getInputStream()));
    PrintWriter pw = new PrintWriter(connection.getOutputStream(),
    true);
    String d = "";
    int c;
    while ((c = buff.read()) != 0) {
    char a = (char) c;
    d = (new StringBuilder(String.valueOf(d))).append(a)
    .toString();
    if (d.length() == 65) {
    Getdata.getdata1(d);
    d = "";
    }
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } } public static void processRequest(Socket requestToHandle, String ordertype,
    String msgdata) {
    synchronized (pool) {
    pool.add(pool.size(), requestToHandle);
    pool.add(pool.size(), ordertype);
    pool.add(pool.size(), msgdata);
    pool.notifyAll();
    }
    } public void run() {
    do {
    synchronized (pool) {
    while (pool.isEmpty()) {
    try {
    pool.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    connection = (Socket) pool.remove(0);
    ordertype = (String) pool.remove(0);
    msgdata = (String) pool.remove(0); }
    handleConnection();
    } while (true);
    }}