代码:             public void run() {
try {
ServerSocket serversocket = new ServerSocket(8201);
while (true) {
socket = serversocket.accept();
SGIPCommand sgipcmd = new SGIPCommand();
DataInputStream in; in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
SGIPCommand cmd = sgipcmd.read(in);
int comandid = cmd.Bytes4ToInt(cmd.getCommandID());
System.out.println("#:" + comandid);
switch (comandid) {
case 1: 
Bind bind = (Bind) cmd;
BindResp bindresp = new BindResp(cmd.header.getUnicomSN());
bindresp.setResult((byte) 0);
bindresp.write(out, nodeid);
System.out.println("bind -- 已经连接");
break;
case 2: 
Unbind unbind = (Unbind) cmd;
UnbindResp unbindresp = new UnbindResp(cmd.header
.getUnicomSN());
unbindresp.write(out, nodeid);
System.out.println("unbind -- 断开连接");
break;
case 4:
Deliver deliver = new Deliver(cmd);
System.out.println("phone:" + deliver.getUserNumber());
System.out
.println("content:" + deliver.getMessageContent());
DeliverResp deresp = new DeliverResp(cmd.header
.getUnicomSN());
deresp.setResult((byte) 0);
deresp.write(out, nodeid);
break;
} }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
   当代码如上的时候,由于客户端与服务端是几次对话,上述代码只能读取一次客户端的值,而且是反复读第一次对话内容,后面的内容不能读取,如果我把socket = serversocket.accept(); 这段代码放到循环外面就可以完成对话,不过完成对话后会话等待一会儿就会报错:
Exception in thread "Thread-0" java.lang.RuntimeException: java.net.SocketException: Connection reset
at com.ginkery.sgip.base.SGIPCommand.read(SGIPCommand.java:59)
at com.ginkery.sgip.smgoper.Recver.run(Recver.java:42)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.read(Unknown Source)
at com.ginkery.sgip.base.SGIPHeader.readHead(SGIPHeader.java:137)
at com.ginkery.sgip.base.SGIPCommand.read(SGIPCommand.java:56)
... 1 more                       

解决方案 »

  1.   

    in = new DataInputStream(socket.getInputStream()), 会导主线程阻塞,一直读取客服端的数据,就能响应其他客户端的socket连接了,所以必须用多线程来解决:
    while (true) {  
           Socket mySocket = myServerSocket.accept();  
           ExecutorService executorService = Executors  
                .newFixedThreadPool(8);  
           executorService.execute(new ServerHander(mySocket, savedir));  
       }  
    或者用nio来处理。
      

  2.   

    嗯 ,是这样的,我准备学下mina ,用mina来做