我可以在关闭 Socket 之前通过 TCP 发送数据吗?
Can I send data via TCP before closing Socket?
我会更好地解释我的问题,我会预防性地为我糟糕的英语道歉。我正在练习 java.net 包(这是我下一次大学考试的参数),我正在尝试更好地控制客户端和服务器设备之间的通信。更准确地说,在对相关套接字调用 close() 方法之前,我尝试使用 TCP 连接在 3 个不同的时间从服务器向客户端发送 3 个不同的字符串。我发现我的脚本无法正常工作。在客户端,我收到所有 3 个字符串,但仅当我关闭套接字时。相反,我希望在将它们放入服务器的输出流后立即接收所有 3 条消息。我将 post 服务器脚本的代码。
批评我之前,我看了this问题再写新的,但是没有解决我的问题
下面的脚本是在服务器端管理我的连接的线程的 运行() 方法的主体。
try{
//Dormi per un pò..
System.out.println("Il Client con ip "+ind+" ed associato all' Handler #"+id+" è in attesa");
Thread.sleep(5000);
PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("Hi "+ind); //ind is the InetAddress of the connected client
pw.flush();
Thread.sleep(5000);
pw.write("what's up?\n");
pw.flush();
Thread.sleep(5000);
pw.write("I gotta go. Bye\n");
pw.flush();
pw.close();
s.close();
System.out.println("Il Client associato all'Handler #"+id+" si è disconnesso");
}catch(Exception e){
e.printStackTrace();
}
这是客户端代码:
package socket;
import java.net.*;
import java.io.*;
public class MultiThreadClient extends Thread{
private byte[] address={(byte) 192, (byte)168, (byte) 1, (byte)15};
private int destPort=2000;
public MultiThreadClient(){
super();
}
public void run(){
try{
InetAddress ip=InetAddress.getByAddress(address);
Socket s=new Socket(ip,destPort);
s.setReuseAddress(true);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String message1=br.readLine();
String message2=br.readLine();
String message3=br.readLine();
System.out.println(message1);
System.out.println(message2);
System.out.println(message3);
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[]args){
//for(int i=0;i<3;i++){
MultiThreadClient mtc=new MultiThreadClient();
mtc.start();
// }
}
}
您的代码运行良好 - 您只是在 readLine
方法上阻塞了 3 次,然后打印您的响应(此时套接字在服务器端关闭)。
试试这个:
String message1 = br.readLine();
System.out.println(message1);
String message2 = br.readLine();
System.out.println(message2);
String message3 = br.readLine();
System.out.println(message3);
我的另一个提示是在 finally
块中进行清理。
try { ... }
catch { ... }
finally {
s.close();
}
这样即使抛出异常也会清理资源。
我会更好地解释我的问题,我会预防性地为我糟糕的英语道歉。我正在练习 java.net 包(这是我下一次大学考试的参数),我正在尝试更好地控制客户端和服务器设备之间的通信。更准确地说,在对相关套接字调用 close() 方法之前,我尝试使用 TCP 连接在 3 个不同的时间从服务器向客户端发送 3 个不同的字符串。我发现我的脚本无法正常工作。在客户端,我收到所有 3 个字符串,但仅当我关闭套接字时。相反,我希望在将它们放入服务器的输出流后立即接收所有 3 条消息。我将 post 服务器脚本的代码。
批评我之前,我看了this问题再写新的,但是没有解决我的问题 下面的脚本是在服务器端管理我的连接的线程的 运行() 方法的主体。
try{
//Dormi per un pò..
System.out.println("Il Client con ip "+ind+" ed associato all' Handler #"+id+" è in attesa");
Thread.sleep(5000);
PrintWriter pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("Hi "+ind); //ind is the InetAddress of the connected client
pw.flush();
Thread.sleep(5000);
pw.write("what's up?\n");
pw.flush();
Thread.sleep(5000);
pw.write("I gotta go. Bye\n");
pw.flush();
pw.close();
s.close();
System.out.println("Il Client associato all'Handler #"+id+" si è disconnesso");
}catch(Exception e){
e.printStackTrace();
}
这是客户端代码:
package socket;
import java.net.*;
import java.io.*;
public class MultiThreadClient extends Thread{
private byte[] address={(byte) 192, (byte)168, (byte) 1, (byte)15};
private int destPort=2000;
public MultiThreadClient(){
super();
}
public void run(){
try{
InetAddress ip=InetAddress.getByAddress(address);
Socket s=new Socket(ip,destPort);
s.setReuseAddress(true);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String message1=br.readLine();
String message2=br.readLine();
String message3=br.readLine();
System.out.println(message1);
System.out.println(message2);
System.out.println(message3);
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[]args){
//for(int i=0;i<3;i++){
MultiThreadClient mtc=new MultiThreadClient();
mtc.start();
// }
}
}
您的代码运行良好 - 您只是在 readLine
方法上阻塞了 3 次,然后打印您的响应(此时套接字在服务器端关闭)。
试试这个:
String message1 = br.readLine();
System.out.println(message1);
String message2 = br.readLine();
System.out.println(message2);
String message3 = br.readLine();
System.out.println(message3);
我的另一个提示是在 finally
块中进行清理。
try { ... }
catch { ... }
finally {
s.close();
}
这样即使抛出异常也会清理资源。