日期:2014-05-20  浏览次数:20958 次

Socket初学者提问
-------------
首先声明:
    我在控制台上编程,
目的:
    能够使得SocketTest(客户端)和ClientTest(服务端)互相通信
自己判断:
    SocketTest可以单独和telnet通信,所以问题锁定在ClientTest上!
-------------
请看代码:

import java.net.* ;
import java.util.* ;
import java.io.* ;
public class ClientTest{
public static void main(String[]args){
long start = System.currentTimeMillis() ;
start() ;
long end = System.currentTimeMillis() ;
System.out.println("总共连接时间:"+(end-start)+"(ms)") ;
}
public static void start(){
try{
   Socket s = new Socket() ;
   try{
s.connect(new InetSocketAddress("127.0.0.1",9000),10000);//连接不得超过10秒钟
OutputStream out  = s.getOutputStream();
InputStream  in   = s.getInputStream () ;

boolean done = false ;
while(!done)
{
Scanner serverSay = new Scanner(in);
String line = "" ;
/***
 * 目的:一开启Client,就先尝试接收服务端发过来的信息
 * 问题:运行程序,并未接到SocketTest服务端传来的提示信息,
 *       我自己调试,发现貌似出现了阻塞,hasNextLine()阻塞了,
 *       导致接收不到数据,但我不知道怎么改?
 */
while( serverSay.hasNextLine() ){
line = serverSay.nextLine() ;
System.out.println(line);
}

System.out.print("我说 : ") ;
String iStr = consoleRead(null) ;         //说话的内容
byte[] serverSayBytes = iStr.getBytes();  //把数据组成字节流
out.write(serverSayBytes) ;          //发送数据
out.flush();
}// end while
   }//end try 
   finally{
s.close() ; 
   }
}//end try
catch(Exception err){
err.printStackTrace() ;
}
}
/**
 * @param: 在输入控制台之前,控制台出现的提示语
 * @return:在控制台输入的语句,以'!'、'!'、'\n'结束
 */
public static String consoleRead(String prompt/*输入控制台前,控制台的提示语*/)
throws IOException{
if( null != prompt )
System.out.println(prompt);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine() ;
return str ;
}
}

-------------
再次声明:
    我在控制台上编程,
目的:
    能够使得SocketTest(客户端)和ClientTest(服务端)互相通信
自己判断:
    SocketTest可以单独和telnet通信,所以问题锁定在ClientTest上!
-------------
【服务端代码,我自己放在1楼,不然问题太长大家不愿看】

提问:
问题1:
     请各位看看问题的ClientTest.java第30行,上面的注释提出了问题。

问题2:
      如果把30行开始的代码
                              while( serverSay.hasNextLine() ){
line = serverSay.nextLine() ;
System.out.println(line);
      }
      改成:
                              //while( serverSay.hasNextLine() ){
line = serverSay.nextLine() ;
System.out.println(line);
      //}
      就能接到SocketTest数据,虽然只能接到一条数据,
      但是,写完数据后,却无法发送回服务端SocketTest,非要Ctrl+C关闭程序时才能发送数据!
      我推测是写的数据被放进了BUF缓存,可是我都out.flush()了?
      所以,依然不解 ... 求指教
【服务端代码,我自己放在1楼,不然问题太长大家不愿看】

------解决方案--------------------
下面是现实客户端给服务端发送信息,并在服务端显示出来(用Eclipse)
服务端

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

public class ServerTread extends Thread
{
private Socket socket;

public ServerTread(Socket socket)
{
this.socket = socket;
}

@Override
public void run()
{
try
{