2013-04-16 78 views
0

我有一个关于从与套接字相关的输入流读写的问题。举例来说,我有关于从输入流(套接字)读取和写入困惑

ServerSocket testie = new ServerSocket(0); 
Socket putClient = new Socket("localhost",testie.getLocalPort()); 
InputStream is = putClient.getInputStream(); 
OutputStream os = putClient.getOutputStream(); 
os.write("testt".getBytes()); 
System.out.println(convertStreamToString(is)); 

但 “testt” 奇怪的是从不打印。该方法convertStreamToString

Read/convert an InputStream to a String

public static String convertStreamToString(java.io.InputStream is) { 
    java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
    return s.hasNext() ? s.next() : ""; 
} 

有没有在我的溪流和插座的理解一些缺陷。我认为,如果你写了一个套接字的输出流,你可以从它的输入流中检索它?该方法无限期地挂起。

+0

''testt“从未打印出奇怪的”。打印什么?这里没有代码可以这样做。 – EJP

回答

3

如果您写入套接字的输出流,您可以从远程读取套接字的输入流。在您的代码中,您正在写入套接字的一侧,然后尝试从同一侧读取数据。

不幸的是,你还没有创建远程套接字。接下来你要做的就是致电ServerSocket上的accept()。这将从putClient收到连接并创建Socket。这个新的套接字将是服务器端套接字。基本上你会有以下几点:

//Server Thread 
ServerSocket testie = new ServerSocket(0); 
Socket remoteSocket = testie.accept(); 
remoteIs = remoteSocket.getInputStream(); 
remoteOs = remoteSocket.getOutputStream(); 
System.out.println(new Scanner(remoteIs).next()); 

//Client Thread 
Socket putClient = new Socket("localhost",testie.getLocalPort()); 
InputStream is = putClient.getInputStream(); 
OutputStream os = putClient.getOutputStream(); 
os.write("testt\n".getBytes()); 
os.flush(); 

请注意,我说了两个不同的线程。问题是呼叫testie.accept()将阻塞,直到它获得连接。但是,new Socket("localhost",testie.getLocalPort())将阻塞,直到连接建立。这些调用不能在同一个线程上进行。

UPDATE:

这也许值得指出的是,我没有在convertStringToStream方法非常有信心。你可能想从一些简单的东西开始,比如我已经解决了上面的问题(注意write调用中的换行符)。