簡體   English   中英

嘗試套接字連接后已在使用的地址

[英]Address already in use after attempting socket connection

嗨,我是Java套接字的新手,我一直在嘗試創建服務器套接字。 我知道可能有人問過這個問題,但是我想請別人看看我的代碼。 有人可以告訴我我要去哪里了,因為我遇到一個錯誤,說“地址已在使用中”,請幫忙嗎? 我還意識到,通過一些研究,我可能會同時運行兩個服務器。 任何人都可以解釋一下嗎?這里是服務器類和客戶端類。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;


public class MessageServer {
public static void main(String[] args) throws IOException{

    //int port = 25000;

    //int port = Integer.parseInt(args[0]); 

    ServerSocket serverr = new ServerSocket(3456);

    while(true){

        System.out.println("Waiting for client...");
        //ServerSocket serverSocket = new ServerSocket(53705);
        //System.out.println("listening on port " + serverSocket.getLocalPort());
        Socket client = serverr.accept();

        System.out.println("Client from " + client.getInetAddress() + " connected.");
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String inputLine = in.readLine();
        System.out.println("Client said: '"+inputLine+"'");
        Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        byte c [] = count.toString().getBytes();
        count.flush();
        //server.close();

    } 

}
}





import java.net.*;
import java.io.*;

public class MessageSendClient {

public static void man(String args[]) throws IOException{
    Socket client = new Socket ("localhost", 3456);
    System.out.println("Connected to " + client.getInetAddress());
    InputStream in = client.getInputStream();

    byte c[] = new byte[100];
    int num = in.read(c);
    String count = new String(c);

    System.out.println("Server said: " + count);
    client.close();
    }
}

異常堆棧跟蹤:

Exception in thread "main" java.net.BindException: Address already in use at
    java.net.PlainSocketImpl.socketBind(Native Method) at     
    java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at 
    java.net.ServerSocket.bind(ServerSocket.java:376) at 
    java.net.ServerSocket.<init>(ServerSocket.java:237) at
    java.net.ServerSocket.<init>(ServerSocket.java:128) at 
    MessageServer.main(MessageServer.java:18)

此錯誤消息表示某些應用程序已經在您指定的端口( 3456 )上創建了套接字。

要解決該問題,您需要將此端口更改為其他端口,或者找出占用該程序的程序並終止該程序。 在Linux中,可以使用netstat命令執行此操作:

# netstat -tulpn | grep :3456

有關netstat命令的更多詳細信息,請參閱本文

當您使用我上面寫的技術確定了該過程后,您可能想要終止它。 假設該進程的PID1234 然后我們將需要以下命令:

# kill -9 1234

您可能需要root權限才能執行此操作。

如果以上方法均無濟於事,則可能是某些外部軟件阻止了您的連接。 它可以是selinux ,也可以是網絡防火牆設置-也可以考慮進行檢查。

這與某個先前的套接字(該程序的先前運行的套接字)保持活動狀態有關,以完成關閉機制上的雙重ACK。 您可以通過為套接字指定一個特定的選項來繞開它:

socket.setReuseAddress(true);

(其中socket是您的服務器套接字)。

要么:

  1. 您的代碼的先前實例仍在運行:終止它。
  2. 港口還有其他聲音:運氣不好。
  3. 程序的上一個實例退出后,連接端口仍處於TIME_WAIT狀態。 等待兩分鍾,或按如下所示創建ServerSocket:

     ServerSocket ss = new ServerSocket(); // create an unbound socket ss.setReuseAddress(true); ss.bind(...); // argument(s) left as an exercise for the reader 

問題在於,當您對代碼進行兩次測試時,您並未完全殺死之前的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM