java多客户端多线程socket通信传输丢失数据的有关问题,各位大神!

java多客户端多线程socket通信传输丢失数据的问题,各位大神!急!急!急!急!急!
遇到个socket通信的问题,服务端接受客户端发过来的数据总丢失,是不是传输流的问题啊?客户端和服务端建立连接后,客户端瞬间多次发送数据(不是一次性发送大量数据),服务端接受时总丢失一部分。
------解决思路----------------------
TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。
从你的程序来看,客户端连续发送2包数据,服务器端有可能一次就全部接到,也可能分2次收到,也可能会收2次以上才能收到。如果在发送“########helloworld”和“######whatisit”之间增加一些延时语句,比如延时1秒,那么可以肯定服务器端只能收到1次,因为在发送第1包数据的时候,服务器端就接收到一次数据,而在发送第2包数据时,服务器已经不再有接收动作了。
就现在的客户端程序来说,如果要在服务器端收到所有数据,可以考虑在服务器端循环接收数据,拼装数据,直到收不到数据为止,然后输出所有接收到的数据。
while(1)
{
                 int rr;
                 sock_fd = accept( sock, NULL, NULL);
                 retval = 0;
                 while(1)
                 {
           rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );
                           if(rr==0) break;
                           memcpy(buf+retval,buf1,rr);
                           retval+=rr;
                 }
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
可以试试看。仅供参考。 

查到个函数ioctlsocket 
while(1) 
{ int rr; 
sock_fd = accept( sock, NULL, NULL);
 retval = 0; 
int iMode = 1; //0:阻塞 
ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置 
while(1) { ....... } 
........ 
}
------解决思路----------------------
服务端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import com.net.csdn.socket.thread.SocketServerThread;

/**
 * 
 * @author Administrator
 *
 */
public class MyServer {

public static void conn() {
try {
ServerSocket ss = new ServerSocket(8080);
while (true) {
Socket so = ss.accept();
System.out.println("服务器新建立连接" + so.getInetAddress() + ":"
+ so.getPort());
new Thread(new SocketServerThread(so)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
conn();
}
}


客户端

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentLinkedQueue;

import com.net.csdn.socket.thread.SocketClientSendThread;

public class MyClient {

private static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();

public static void main(String[] args) throws UnknownHostException,
IOException, InterruptedException {

SocketClientSendThread sc = new SocketClientSendThread(queue);
queue.add("0eof");
new Thread(sc).start();
// 多次发送数据
for (int i = 1; i < 100; i++) {
// Thread.sleep(2000);
queue.add(String.valueOf(i) + "eof");
}
}
}


几个处理的线程
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class SocketServerThread implements Runnable {

private Socket so;

public SocketServerThread(Socket socket) {
this.so = socket;
}

public void run() {
try {
while (true) {
byte[] by = new byte[5 * 1024];
DataInputStream ds = new DataInputStream(
so.getInputStream());

DataOutputStream os = new DataOutputStream(
so.getOutputStream());
String clientMsg = "";
boolean flag = false;
// 读取输入流

while (((clientMsg=ds.readUTF())!=null)) {
flag = true;
//clientMsg = new String(by);
int index = clientMsg.indexOf("eof");
if(index!=-1){
System.out.println("从客户端接受的数据"+clientMsg.substring(0,index));

os.writeUTF((clientMsg.substring(0, index) + "success eof")
);
os.flush();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentLinkedQueue;

public class SocketClientSendThread implements Runnable {

private ConcurrentLinkedQueue<String> queue;
public SocketClientSendThread(ConcurrentLinkedQueue<String> queue){
this.queue=queue;
}
public void run() {
try {
Socket so = new Socket("127.0.0.1", 8080,
InetAddress.getLocalHost(), 63313);
SocketClientReponseThread scr = new SocketClientReponseThread(so);
scr.start();
while (true) {
if (!queue.isEmpty()) {
DataOutputStream os = new DataOutputStream(
so.getOutputStream());
os.writeUTF(queue.poll());
os.flush();
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class SocketClientReponseThread extends Thread{

private Socket so;

public SocketClientReponseThread(Socket socket) {
this.so = socket;
}

public void run() {
while (true) {
try {
DataInputStream is = new DataInputStream(
so.getInputStream());
String serverMsg;
while (((serverMsg=is.readUTF()) != null)) {
int index = serverMsg.indexOf("eof");
if (index != -1) {
System.out.println("从服务端接收到应答:"
+ serverMsg.substring(0, index));
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

就是在你原来的代码基础上改的,最后控制台输出
服务端控制台
java多客户端多线程socket通信传输丢失数据的有关问题,各位大神!
客户端控制台
java多客户端多线程socket通信传输丢失数据的有关问题,各位大神!
------解决思路----------------------
别这么写程序,服务器会累死的,SOCKET通讯用APACHE 的MINA组件,NIO是比合理的。。。。。