[英]Android TCP send data trough one socket
具有以下代码:
public static PrintWriter outToServer;
private static Socket clientSocket;
public static void register(InetAddress ip, int port, String name) {
try {
Utils.ip = ip;
Utils.port = port;
Utils.name = name;
clientSocket = new Socket(Utils.ip, Utils.port);
outToServer = new PrintWriter(clientSocket.getOutputStream(),true);
send("reg:" + name);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void send(String str) {
outToServer.println(str);
}
在应用程序启动时,我一次调用了register
方法。 在我使用send
方法将数据发送到服务器之后。 问题在于只有从register
调用的第一个send
才从服务器正确接收。 其他所有邮件都已发送但未收到(或者,如果没有,我看不到它们被显示)。 我的服务器代码:
public static void main(String argv[]) throws Exception {
String clientSentence;
ServerSocket welcomeSocket = new ServerSocket(9876);
while (true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
clientSentence = inFromClient.readLine();
System.out.println("Received: " + clientSentence);
}
}
好的,但是当我从客户端尝试此代码时,它通过发送更多的流量来工作(我不想要这样)。
public static PrintWriter outToServer;
private static Socket clientSocket;
public static void register(InetAddress ip, int port, String name) {
try {
Utils.ip = ip;
Utils.port = port;
Utils.name = name;
send("reg:" + name);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void send(final String str) {
new Thread(new Runnable() {
@Override
public void run() {
try {
clientSocket = new Socket(Utils.ip, Utils.port);
outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
outToServer.println(str);
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
我需要对此做一些解释。
从一个套接字可以有多个OutPutStreams?
当我关闭OutPutStream并尝试在同一套接字上打开一个新的套接字时,为什么会出现socketClosed
异常。 我仅在立即send
定义outToServer
:
public static void send(final String str) {
new Thread(new Runnable() {
@Override
public void run() {
try {
PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
outToServer.println(str);
outToServer.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}
您需要在套接字上设置TCP_NODELAY 。 默认情况下,数据将一直缓存到填充整个数据包为止。 当缓冲区已满时,将发送一个数据包。 但是,对于此协议,您希望立即发送数据,以便服务器可以响应。
从一个套接字可以有多个OutputStreams?
该套接字只有一个输入流和一个输出流。
当我关闭OutputStream并尝试在同一套接字上打开一个新的套接字时,为什么会出现socketClosed异常。
因为关闭套接字输入或输出流会关闭套接字,如Javadoc中所述。
注意:您发布的服务器代码永远不会关闭任何内容。 您发布的客户端代码永远不会关闭任何内容,只会发送一条消息。
NB 2 PrintWriter会吞下异常,因此不应在网络上使用。 使用BufferedWriter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.