我越來越沮喪在java.net.SocketOutputStream,只是拒絕正確刷新!我必須忽視這個明顯的問題。在我下面的Groovy腳本中,我嘗試連接到在Galaxy Nexus Android 4.0.2手機上運行的簡單套接字服務器,並在我的5秒超時過期後立即給出套接字關閉異常。無法刷新Groovy套接字
SocketClient.groovy
import java.net.*
socket = new Socket()
socket.connect(new InetSocketAddress(InetAddress.getByAddress([172,17,57,21] as byte[]), 58789), 5000)
println "Connected!"
socket.withStreams { input, output ->
println "Processing ${input.class.name} and ${output.class.name} streams..."
output.withWriter {
it << 'echo testing\n\n';
it.flush();
output.flush()
def readerThread = Thread.start {
println "Request written, reading response..."; println input.text
}
println "Waiting 5 secs for read to complete."
readerThread.join(5000)
}
println "Stream closed!"
}
我試過沖洗所有不同的手段,包括輸出流間接包裝與作家和沖洗的直接沖洗。在數據流關閉之前服務器上沒有數據出現,導致套接字關閉,導致套接字讀取嘗試失敗。我究竟做錯了什麼?我也會在下面嵌入我的Android代碼。這是一個啓動套接字服務器的簡單活動。
MyServer.java
package com.example;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MyServer extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RawSocketServer rawSocketServer = new RawSocketServer();
String port = rawSocketServer.getLocalPort();
TextView textView = (TextView) this.findViewById(R.id.mainTextView);
textView.setText("Server bound to port " + port);
rawSocketServer.start();
}
}
RawSocketServer.java
package com.example;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by IntelliJ IDEA.
* User: cliff
* Date: 5/9/12
* Time: 4:03 PM
*/
public class RawSocketServer {
public static final int PORT = 0;
private ServerSocket serverSocket;
public RawSocketServer() {
this(PORT);
}
public RawSocketServer(int port) {
try {
this.serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("server cannot bind to port " + port);
}
}
public void start() {
new Thread(new Runnable() {
public void run() {
go();
}
}).start();
}
private void go() {
Socket socket = null;
while (true) {
try {
socket = this.serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("cannot accept from server socket" + e);
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Could not get input stream from socket. " + e);
}
PrintWriter writer = null;
try {
writer = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Could not get output stream from socket. " + e);
}
try {
for (String line = reader.readLine(); line !=null; line = reader.readLine()) {
writer.print(line);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Error reading/writing from/to socket. " + e);
}
}
}
public String getLocalPort() {
return "" + serverSocket.getLocalPort();
}
}
嘿blackdrag,趕上!這是完全合理的,我會檢查一下! – Cliff
昨晚我又試了一次,並添加了新的代碼到我的Groovy套接字客戶端,但我仍然得到相同的行爲。我剛剛發現你提到的服務器可能有同樣的問題,所以我會嘗試下一步。 – Cliff