Поиск скрытой ошибки, вызывающей исключение java.net.SocketException: нераспознанная ошибка Windows Sockets: 0: невозможно связать - PullRequest
2 голосов
/ 01 января 2012

** Вот простой код чата между двумя пирами. По моему мнению, код делает то, что должен, но я сталкиваюсь с трудностями при решении этой ошибки SocketException. Этот код работал нормально, пока я не сделал последние изменения. И теперь мне трудно отследить ошибку.

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.net.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class UDPchat extends Thread implements ActionListener
{
    JFrame f;
    JPanel p;
    JTextField text;
    JButton b;
    JTextArea ta;
    private final static String newline = "\n";
    private final static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    int porttor=7777; // port to send/receive datagrams on
    //int porttos=5555;
    String remoteIPaddress= ("127.0.0.1");      // IP to send datagrams

    public UDPchat() throws Exception
    {
        start();      // start thread to receive and display datagrams
        f=new JFrame("CHAT WINDOW");
        p= new JPanel();
        text = new JTextField();
        text.setColumns(25);

        b = new JButton("SEND");

        b.addActionListener(this);

        ta = new JTextArea("Chat messages",20,50);

        ta.setEditable(false);

        f.setLayout(new FlowLayout());

        p.add(text,BorderLayout.NORTH);

        p.add(b,BorderLayout.SOUTH);

        f.setLayout(new BorderLayout());

        f.add(ta,BorderLayout.NORTH);

        f.add(p,BorderLayout.SOUTH);

        f.setSize(400, 400);

        f.setVisible(true);
    }

    @Override

    public void actionPerformed(ActionEvent e)
    {

        try
        {

            String s = text.getText();  // read a String

            text.setText(" ");

            ta.append(newline);

            ta.append(s);

            //System.out.println("Sending to " + remoteIPaddress + " socket " + port + " data: " + s);

            byte[] data = s.getBytes();  // convert to byte array

            DatagramSocket theSocket = new DatagramSocket();  // create datagram socket and the datagram

            DatagramPacket   theOutput = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 5555);

            theSocket.send(theOutput);     

        }

        catch(Exception et)
        {

            System.out.println("Error sending datagram" + et);

        }

    }

    // thread run method, receives datagram and display contents as a string
    public void run()                
    {

        try
        {

            // open DatagramSocket to receive 

            DatagramSocket ds = new DatagramSocket(7777);

            // loop forever reading datagrams from the DatagramSocket

            while (true)
            {

                byte[] buffer = new byte[65507];  // array to put datagrams in

                DatagramPacket dp = new DatagramPacket(buffer, buffer.length);  // DatagramPacket to hold the datagram

                try {

                    ds.receive(dp);

                } catch (IOException e) {

                    // TODO Auto-generated catch block

                    System.err.println("chat error2 " + e);

                }   // wait for next datagram

                String s = new String(dp.getData(),0,dp.getLength()); // get contents as a String

                System.out.println("UDP datagram length " + s.length()+ "  from IP " + dp.getAddress() + " received: " + s );

                ta.append(newline);

                ta.append(s);

            }

        }

        catch (SocketException se)
        {

             System.err.println("chat error1 " + se);

        }

        //catch (IOException se) {System.err.println("chat error2 " + se);}

        //System.exit(1);   // exit on error

    }

    public static void main(String args[]) throws Exception
    {

        UDPchat c=new UDPchat();

    }

}

Ответы [ 2 ]

1 голос
/ 01 января 2012

Убедитесь, что вы делаете два типа DatagramSockets в своем коде, попробуйте предоставить оба одинаковых порта 7777.Один в вашем методе actionPerformed () как:

DatagramSocket theSocket = new DatagramSocket();  // create datagram socket and the datagram

и один в вашем методе выполнения как:

// open DatagramSocket to receive 

DatagramSocket ds = new DatagramSocket(7777);

Верхний конструктор создает сокет дейтаграммы и связывает его с любым доступнымпорт на локальном хосте, а второй пытается подключиться к порту 7777. Попробуйте инициализировать оба порта по одному и тому же номеру порта, что поможет вам разобраться.

Надеюсь, что это может как-то помочь.

С уважением

1 голос
/ 01 января 2012

Вы уверены, что есть другое приложение, связанное с этим портом (7777)?Вы пробовали другой порт с таким же результатом?

А также, пожалуйста, убедитесь, что не работает антивирус или брандмауэр, он также может отказаться от привязки к порту.

...