服务端用java写了一个socket通讯程序,下面是语句部分:
import java.io.*;
import java.sql.*;
import java.net.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.text.*;class ServeOneJabber extends Thread {
private Socket socket; private BufferedReader in; private PrintWriter out; public ServeOneJabber(Socket s) throws IOException {
socket = s;
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
start();
} public void run() {
try {
while (true) {
String str = in.readLine();
System.out.println("接收到的字符串:"+str);
//System.out.println(str);
if (str.equals("CMD_END"))
break;
if(str.equals(null))
break;
//根据收到的数据进行判断并进行处理
String mystr = str.replaceAll("\\*#\\*", ",");
String[] sub = mystr.split(","); //转换成数组 if (sub[0].equals("CMD_LOGIN")) { //用户登录

                  //具体语句部分略

} } } catch (IOException e) {
} finally {
try {
System.out.println("关闭当前socket...");
socket.close();
} catch (IOException e) {
}
}
}
}public class CmccServer {
static final int PORT = 8808; public static void main(String[] args) throws IOException { ServerSocket s = new ServerSocket(PORT);
System.out.println("服务开始... ");
try {
while (true) { Socket socket = s.accept();
try {
new ServeOneJabber(socket);
} catch (IOException e) { socket.close();
}
}
} finally {
s.close();
}
}
}为什么用java写的客户端程序能正常连接并通讯,而用VB等写的客户端程序能连通java服务端,但是必须手动断开后才能把数据发送到java服务端,并且总会发送一行null数据,另一行数据才是正常发送应该收到的数据?

解决方案 »

  1.   

    我的意思也就是为什么vb客户端连接java服务端时,
    1.为什么vb客户端连通时就发一个null到java服务端?
    2.还有就是为什么vb客户端必须断开后才能把数据发送到java服务端?
      

  2.   

    另外,这不是java的问题,这是VB Socket机制的问题。你应聘java还是应聘VB?
      

  3.   

    我应聘的单位要求java和vb都会,可是我不知道怎样解决这个问题,以前都是直接java对java和vb直接对vb,现在java对vb就出现了这个问题?
      

  4.   

    第2问题解决,第1问题还是搞不懂,为什么当vb手动断开后会发送一个null到java服务端?
      

  5.   

    > if(str.equals(null))什么破面试题目java.io.BufferedReader片段:    String readLine(boolean ignoreLF) throws IOException {
    StringBuffer s = null;
    int startChar;
    boolean omitLF = ignoreLF || skipLF;        synchronized (lock) {
                ensureOpen(); bufferLoop:
        for (;;) { if (nextChar >= nChars)
        fill();
    if (nextChar >= nChars) { /* EOF */
        if (s != null && s.length() > 0)
    return s.toString();
        else
    return null; //<<------HERE
    }估计VB在关闭的时候自动发送了一个EOF,而上一次的已经被readLine读过,因而就只有一个null