-------------
首先声明:
我在控制台上编程,
目的:
能够使得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
{