使用套接字连接我需要有两个线程,一个用于读取,一个用于写入。我发现了有关套接字连接的其他问题,但我不明白我如何在两个不同的线程中使用相同的套接字。
我必须在与UI线程不同的线程中创建一个套接字,所以我需要启动一个线程来创建套接字。我在哪里可以开始这两个线程?
答案 0 :(得分: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
}
}
}
}
答案 1 :(得分:0)
根据您的问题判断,这是客户方。您不必在两个不同的线程中使用套接字本身。对于读取线程,您使用套接字的InputStream,对于写入线程,您使用OutputStream。 这样您就不必为套接字创建单独的线程。读取和写入线程都可以从UI线程启动。为了创建线程,我引用了您的Android文档Processes and Threads。