使用套接字连接我需要有两个线程,一个用于读取,一个用于写入。我发现了有关套接字连接的其他问题,但我不明白如何在两个不同的线程中使用同一个套接字。
我必须在与 UI 线程不同的线程中创建一个套接字,所以我需要启动一个线程来创建套接字。我在哪里可以开始这两个线程?
问问题
1546 次
2 回答
2
示例代码结构给你一个想法。
public class SocketActivity extends Activity {
Socket s;
OutputStream dout;
String ip = "127.0.0.1";
int port = 8080;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(new Runnable() {
@Override
public void run() {
try {
s = new Socket(ip, port);
new Thread(new ReaderRunnable(s));
new Thread(new WriteRunnable(s));
} catch (IOException e) {
e.printStackTrace();
//Handle error state
}
}
});
}
// You can put this class outside activity with public scope
class ReaderRunnable implements Runnable {
Socket socket;
public ReaderRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
if (socket != null && socket.isConnected()) {
try {
OutputStream out = new BufferedOutputStream(socket.getOutputStream());
//Do reader code
} catch (IOException e) {
e.printStackTrace();
}
} else {
//Handle error case
}
}
}
// You can put this class outside activity with public scope
class WriteRunnable implements Runnable {
Socket socket;
public WriteRunnable(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
if (socket != null && socket.isConnected()) {
try {
InputStream out = new BufferedInputStream(socket.getInputStream());
//Do writer code
} catch (IOException e) {
e.printStackTrace();
}
} else {
//Handle error case
}
}
}
}
于 2016-04-07T09:57:20.157 回答
0
从你的问题来看,这是客户端。您不必在两个不同的线程中使用套接字本身。对于读取线程,您使用套接字的 InputStream,对于写入线程,您使用 OutputStream。这样您就不必仅为套接字创建单独的线程。读取和写入线程都可以从 UI 线程启动。对于创建线程,我建议您参考 Android 文档进程和线程。
于 2012-12-07T09:50:06.783 回答