阻止正在打开/正在使用的java套接字
你好 java中有一个sendMessage函数,如下所示。它目前以静态方法存在,可以由任何线程操作(如HTTP请求)调用。但是,如果同时发送两个请求,其中一个sendMessage请求将抛出“连接重置” 我需要知道我当前的端口和ip正在使用中!这样我就不会重置连接,而是等待它再次可用。有办法吗阻止正在打开/正在使用的java套接字,java,rest,tcp,connection,Java,Rest,Tcp,Connection,你好 java中有一个sendMessage函数,如下所示。它目前以静态方法存在,可以由任何线程操作(如HTTP请求)调用。但是,如果同时发送两个请求,其中一个sendMessage请求将抛出“连接重置” 我需要知道我当前的端口和ip正在使用中!这样我就不会重置连接,而是等待它再次可用。有办法吗 private static String sendMessage(int command,String data,int port,String ip){ try{ Strin
private static String sendMessage(int command,String data,int port,String ip){
try{
String sendString=Integer.toString(command)+":"+data+'$'+'\n';
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
Socket clientSocket = new Socket();
InetAddress addr = InetAddress.getByName(ip);
SocketAddress sockaddr = new InetSocketAddress(addr, port);
clientSocket.connect(sockaddr, 20000);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sendString);
String rcvString = inFromServer.readLine();
System.out.println("FROM DEVICE: " + rcvString);
clientSocket.close();
return rcvString;
}catch(Exception e){
System.err.println(e.getMessage());
}
return NULL;
}
好吧,我刚想到一个巧妙的解决方案,但它很难看 有一个blockChecker类
public class BlockerCheck {
List<String> blockerList;
public BlockerCheck(){
blockerList=new ArrayList<String>();
}
public synchronized void addBlock(String ip,int port){
String finalString=ip+":"+Integer.toString(port);
blockerList.add(finalString);
}
public synchronized void removeBlock(String ip,int port){
String finalString=ip+":"+Integer.toString(port);
blockerList.remove(finalString);
}
public synchronized boolean isAvailable(String ip,int port){
String finalString=ip+":"+Integer.toString(port);
System.out.println("SIZE:" +blockerList.size());
return !(blockerList.contains(finalString));
}
}
我认为你的客户代码没有问题。相反,我怀疑您没有为服务器端的每个连接创建线程。将您的方法
同步
设置为私有同步静态字符串sendMessage
这将做什么?好的,我正在使用servlet。因此,每个servlet请求都是根据jetty doc在自己的线程中处理的。这不起作用。它弄乱了我的TCP数据。我想听听一些意见。我是否需要包含sendMessage的同步标签?
private static String sendMessage(int command,String data,int port,String ip){
if(blockerCheck.isAvailable(ip, port)) blockerCheck.addBlock(ip, port);
else{
long startTime=TimeUnit.SECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
while(!(blockerCheck.isAvailable(ip, port))){
long currTime=TimeUnit.SECONDS.convert(System.nanoTime(), TimeUnit.NANOSECONDS);
if((currTime-startTime)>10) return null; //ensure null handled
}
}
//SENDING CODE HERE
blockerCheck.removeBlock(ip, port);
}