读书人

java socket 发送消息有关问题。

发布时间: 2013-08-25 10:49:56 作者: rapoo

java socket 发送消息问题。。。
看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)

[解决办法]
"server send:"是服务端固定的字符,可以考虑先将服务端内容读取出来后,把"server send:"固定拼接到前面即可。

这个错误,应该是close方法的问题,建议做成多线程的。
[解决办法]
引用:
Quote: 引用:

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

这样不对吧。。。只对一个客户端服务??

声明在外面,实现在里面啊,只是为了方便关闭,你这个循环一次,socket给关一次?。。
[解决办法]
额!我想问一下,你这个这么长就是为了单单知吧 “a server send”写出去?这个是server端,原意是把client端的东西读进来然后再发出去直接在原来的代码上dos.writeUTF("a server send:”+str),ps:你加个处理流吧,数组看起来好大一坨
------解决方案--------------------


引用:
Quote: 引用:

Quote: 引用:

楼主的设计太复杂了。

buffer中预先放置一些数据 那还是buffer嘛~~

那像这种需求在实际应用中通常是怎么解决的?

如果你是读字符串的话用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();

}

}

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

读书人网 >J2SE开发

热点推荐