看java tcp/ip socket编程实战  书上有个例子是把客户端发送过来的消息原封不动的返回给客户端  现在我有个想法就是  在客户端发送过来的消息基础上加一些信息  比如客户端发过来"abc" 服务端就返回给客户端"server send abc"  书上的例子是用了一个byte[]作为buffer用来接收客户端发过来的消息  我的想法是在这个buffer中预先放置一些数据  然后把客户端发来的信息追加到 buffer中 发送过去  但是好像不行
关键代码如下:
byte[] receiveBuf = new byte[BUFSIZE];
byte[] serverInfo = "server send:".getBytes();
for(int i = 0;i < serverInfo.length;i ++){
receiveBuf[i] = serverInfo[i];
}
while(true){
Socket client = serverSocket.accept();
SocketAddress clientAddress = client.getRemoteSocketAddress();
System.out.println("client address:" + clientAddress);
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
while((recvMsgSize = in.read(receiveBuf,serverInfo.length,in.available())) != -1){
out.write(receiveBuf);
}
client.close();
}
错误提示:Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at TcpEchoServer.main(TcpEchoServer.java:37)

解决方案 »

  1.   

    "server send:"是服务端固定的字符,可以考虑先将服务端内容读取出来后,把"server send:"固定拼接到前面即可。这个错误,应该是close方法的问题,建议做成多线程的。
      

  2.   

    楼主的设计太复杂了。buffer中预先放置一些数据 那还是buffer嘛~~
      

  3.   

    socket的定义和client.close();拿到while外面去
      

  4.   

    这样不对吧只对一个客户端服务??
    声明在外面,实现在里面啊,只是为了方便关闭,你这个循环一次,socket给关一次?。。
      

  5.   

    额!我想问一下,你这个这么长就是为了单单知吧 “a server send”写出去?这个是server端,原意是把client端的东西读进来然后再发出去直接在原来的代码上dos.writeUTF("a server send:”+str),ps:你加个处理流吧,数组看起来好大一坨
      

  6.   

    那像这种需求在实际应用中通常是怎么解决的?
    如果你是读字符串的话用BufferedReader 直接读字符串好了。
    BufferedReader _in = new BufferedReader(new InputStreamReader(this._socket.getInputStream()));
    String str = this._in.readLine();
      

  7.   

    那像这种需求在实际应用中通常是怎么解决的?
    如果你是读字符串的话用BufferedReader 直接读字符串好了。
    BufferedReader _in = new BufferedReader(new InputStreamReader(this._socket.getInputStream()));
    String str = this._in.readLine();写个完整的例子给你好了
    import java.io.*;import java.net.*;public class Server { private ServerSocket _ServerSocket; private Socket _socket; private BufferedReader _in; private PrintWriter _out; public Server(){ try{ this._ServerSocket = new ServerSocket(10000); while(true){ this._socket = this._ServerSocket.accept(); this._in = new BufferedReader(new InputStreamReader(this._socket.getInputStream())); this._out = new PrintWriter(this._socket.getOutputStream()); while(true){ try{ String str = this._in.readLine(); System.out.println("client cmd=" + str); this._out.println("your input is:" + str); this._out.flush(); if("exit".equals(str)){ break; } }catch(IOException e){ System.out.println("the client's connection is lose"); break; } } this._out.close(); this._in.close(); this._socket.close(); } }catch(IOException e){
    e.printStackTrace();
    }
    }
    public static void main(String[] args){ new Server(); }}
      

  8.   

    我也这么做过。
    楼主可以采用先把接收到的byte[]转化成String类,再拼接字符串之后转回Byte[]数组就可以了