还是原码问题

04-07-21 zhebincong
最近有一个项目要用到socket技术,恰好在书店发现贵书,索性买了一本,回家阅读时才发现代码问题太多,书中给出的都是代码片断,光盘上很多空文件,例如:TCPHandler就是一空文件,而书上的代码还存在错误,例如:TCPHandler中有一个state变量未声明等等。请作者最好能把代码整理一下,发给大家,如果是光盘问题,请尽快答复,我好回书店更换。

谢谢!

banq
2004-07-21 16:17
书中代码只给出主要代码,这是本书的特点,因为书重在讲解怎么做,而不是将做好的出售。所以,在这里也不可能公布全部代码,原因见其他贴。

关于其他低级问题,基本是印刷和编辑的问题,TCPHandler为空,编辑没有审核,TCPHandler中源码都是经过调试,没有语法问题。

代码如下:

package com.jdon.jserver.connector.tcp;

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.nio.charset.*;
import java.util.*;

import com.jdon.util.Debug;

import com.jdon.jserver.connector.SocketDataHandler;
import com.jdon.jserver.connector.queue.QueueFactory;

/**
 * TCP数据包读和发送处理类
 * <p>Copyright: Jdon.com Copyright (c) 2003</p>
 * <p>Company: 上海解道计算机技术有限公司</p>
 * @author banq
 * @version 1.0
 */
public class TCPHandler implements Runnable {

  private final static String module = TCPHandler.class.getName();

  private SocketDataHandler socketDataHandler;

  private final SocketChannel sc;
  private final SelectionKey sk;

  private static final int READING = 0, SENDING = 1;
  private int state = READING;

  public TCPHandler(SelectionKey sk, SocketChannel sc) throws IOException {

    socketDataHandler = new SocketDataHandler(QueueFactory.TCP_QUEUE);
    this.sc = sc;
    this.sk = sk;
  }

  public void run() {
    try {
      if (state == READING)
        read();
      else if (state == SENDING)
        send();

    } catch (Exception ex) {
      Debug.logWarning("warn:" + ex, module);
      close();
    }
  }

  private void read() throws Exception {
    try {
      byte[] array = socketDataHandler.getByte();
      ByteBuffer buffer = ByteBuffer.wrap(array);

      int bytes = sc.read(buffer);
      if (bytes == -1) return;
      socketDataHandler.receiveRequest(array);

      state = SENDING;
      sk.interestOps(SelectionKey.OP_WRITE);
    } catch (Exception ex) {
      Debug.logError(ex, module);
      throw new Exception(ex);
    }

  }

  private void send() throws Exception {
    try {
      byte[] response = socketDataHandler.sendResponse();
      ByteBuffer buffer1 = ByteBuffer.wrap(response);
      sc.write(buffer1);

      state = READING;
      sk.interestOps(SelectionKey.OP_READ);

    } catch (Exception ex) {
      Debug.logError(ex, module);
      throw new Exception(ex);
    }

  }

  public void close() {
     if (sc != null) {
       try {
         sk.cancel();
         sc.close();
       } catch (Exception ignored) {
       }
     }
   }




}

zhebincong
2004-07-22 15:31
你好:
是的,我也赞同你的观点,书中没必要写出完整代码,那会浪费很大篇幅,同时又不能突出重点,但是光盘上必须提供完整的可运行代码,这样读者才能有一个最终的依据,况且,通过您提供的代码来看,书中的代码和光盘的代码还有很大出入,下面我把书中的代码抄下来,您可以比对一下。其中空文件还不止TCPHandler,他只是我举出的一个例子而已,其他例如:chattcpserver,chatudpserver,wrapfactory等,都是空文件,而且,目前我只读了第一章,后面还会有类似情况,我也无法把整个光盘统统检查一下,据我估计,可能是你们某一批书印刷和制作时,都存在问题,所以到书店去更换光盘大概也没用,建议你们和出版社再重新核对一下,保证下批书的质量,否则很影响生意。鉴于目前状况,如果我每遇到类似情况,都来找你给我发代码,恐怕你我都很麻烦,不如你将整个光盘的内容压缩发到我邮箱中,但最好的办法还是在你们的论坛首页提供一个下载链接,其他有问题的读者直接去下载,免得你一一答复。
我简单的对全书浏览了一下,觉得这本书确实不错,与市面上其他那些东抄西抄的滥书相比,这本书确实是作者用经验和心血写成的,他列举了大部分从初级程序员向中高级程序员跨越所必须掌握的知识,特别适合中级程序员学习和借鉴,因为书中涵盖面很广,不可能每一项都详细描述,需要一定基础,必要时参考相关文档,所以,初级程序员读起来要困难一些。目前,从论坛上看,大家确实对书的质量意见很多,还请你们能够重视,别到头来,花了很大精力,付出了很大努力,只因为工作细节上的不经心,被大家埋怨。
谢谢!
另外,我的邮箱地址是:congzhebin@capinfo.com.cn


public class TCPHandler implements Runnable {
	private final static String module = TCPHandler.class.getName();
	private final SocketChannel sc;
	private final SelectionKey sk;
	private SocketHelper socketHelper;

	public TCPHandler(SelectionKey sk, SocketChannel sc) throws IOException {
		this.sc = sc;
		this.sk = sk;
		socketHelper = new SocketHelper();
		Debug.logVerbose("SocketReaderHandler prepare...", module);
	}
	public void run() {
		Debug.logVerbose("Handler running...", module);
		try {
			if (state == READING)
				read();
			else if (state == SENDING)
				send();
		} catch (Exception ex) {
			Debug.logVerbose("readRequest error:" + ex, module);
			socketHelper.close(sc);
			sk.cancel();
		}

	}

	private void read() throws Exception {
		try {

			byte[] bytes = socketHelper.readSocket(sc);
			if (bytes.length == 0)
				throw new Exception();
			//实现服务器聊天核心处理功能,这里展示打印出来,方便测试
		
	System.out.println("get result is:" + new String(bytes));
			state = SENDING;
			sk.interestOps(SelectionKey.OP_WRITE);
			catch (Exception ex) {
				throw new Exception(ex);
			}
		}

		private void send() throws Exception {
			try {
				String request1="come back";
				System.out.println("sending result is:"+request1);
				socketHelper.writeSocket(request1.getBytes(),sc);
				state = READING;
				sk.interestOps(SelectionKey.OP_READ);
				catch (Exception ex) {
					throw new Exception(ex);
				}

		}
	}


<p class="indent">






hitzxl
2004-07-23 10:14
我也有同样问题!~我已经买来书很久了,阅读和调试实在困难,希望作者能好好重视这个问题!