UDP中的一台服务器和多客户端聊天框

布莱克

我正在尝试使用Java中的UDP网络设计聊天应用程序。

这是我的服务器:

package ChatBox;

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server implements Runnable {

public Hashtable<String, InetAddress> table;
public Hashtable<String, Integer> tab;
DatagramSocket sock = new DatagramSocket(5050);
DatagramPacket pack;
private String str[];
int Port;

Server(String str[]) throws SocketException, UnsupportedEncodingException, IOException {
    this.str = str;
    String Sname = str[2];
    System.out.println(Sname);
    byte[] data = new byte[1000];
    pack = new DatagramPacket(data, data.length);
    sock.receive(pack);
    String s = new String(data, "UTF-8");
    String s1 = s.replaceAll("\n", " ");
    StringTokenizer st = new StringTokenizer(s1, " ");
    int f1 = 0, f2 = 0, f3 = 0;
    String sender;

    while (st.hasMoreTokens()) {
        String s2 = st.nextToken();
        if (s2.equals("Via:")) {
            if (st.nextToken().equals(Sname)) {
                f1 = 1;
            }
        } else if (s2.equals("To:")) {
            if (st.nextToken().equals(Sname)) {
                f2 = 1;
            }
        }
        else if(s2.equals("From:"))
        {
            sender = st.nextToken();
            table.put(sender, pack.getAddress());
        }
        else if (s2.equals("Port:")) {
            Port = Integer.parseInt(st.nextToken());
            if (tab.get(Port) != null) {
                f3 = 1;
            }
        }
    }
    if ((f1 == 1) && (f2 == 1) && (f3 == 1)) {
        new Thread(this).start();
    } else {
        if (f1 == 0) {
            System.out.println("Warning: Server name mismatch. Message dropped.");
        }
        if (f2 == 0) {
            System.out.println("Warning: Server name mismatch. Message dropped.");
        }
        if (f3 == 0) {
            System.out.println("Warning: Unknown recipient. Message dropped.");
        }
    }
}

public void run() {
    while (true) {
        try {
            String s;
            String namefind;
            String name = null;
            byte[] data = new byte[1000];
            DatagramPacket receivePack = new DatagramPacket(data, data.length);
            sock.receive(receivePack);
            System.out.println(new String(receivePack.getData()));
            s = new String(data, "UTF-8");
            String s1 = s.replaceAll("\n", " ");
            StringTokenizer st = new StringTokenizer(s1, " ");
            while (st.hasMoreTokens()) {
                namefind=st.nextToken();
                if (namefind.equals("Body:")) {
                    namefind = st.nextToken();
                    StringTokenizer namefind2 = new StringTokenizer(namefind, "$");
                    name = namefind2.nextToken();
                    tab.put(name, Port);
                }
            }
            sendPackToClient(receivePack,name);

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
public void sendPackToClient(DatagramPacket receivePack,String name) throws IOException {
    byte[] data = receivePack.getData();
    String s = new String(data, "UTF-8");
    InetAddress add = table.get(name);
    DatagramPacket dp = new DatagramPacket(s.getBytes("UTF-8"), s.getBytes("UTF-8").length, add, Port);
    sock.send(dp);
}

public static void main(String[] args) throws SocketException, IOException {
    try {
        String str[]={"java", "Server ","NetworkingAssignmentServer"};
        new Server(str);
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

这是我的客户:

package ChatBox;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Client {

Thread send;
Thread accept;
DatagramPacket pack;
DatagramSocket sock;
private String str[];
String name, sname;
int listeningPort;
InetAddress server_ip;
String message, sender;

public Client(String s[]) throws UnsupportedEncodingException, IOException {
    this.str = s;
    name = str[2];
    System.out.println(name);
    listeningPort = Integer.parseInt(str[3]);
    server_ip = InetAddress.getByName("127.0.0.1");
    sname = str[5];
    System.out.println(sname);
    sock = new DatagramSocket(5050);
    byte[] data = new byte[1000];
    pack = new DatagramPacket(data, data.length);
    sock.receive(pack);
    String incoming = new String(data, "UTF-8");
    String s1 = incoming.replaceAll("\n", " ");
    StringTokenizer st = new StringTokenizer(s1, " ");
    int f1 = 0, f2 = 0;

    while (st.hasMoreTokens()) {
        String s2 = st.nextToken();
        if (s2.equals("Via:")) {
            if (st.nextToken().equals(sname)) {
                f1 = 1;
            }
        } else if (s2.equals("To:")) {
            if (st.nextToken().equals(name)) {
                f2 = 1;
            }
        }

    }
    if ((f1 == 1) && (f2 == 1)) {
        send = new Thread() {

            public void run() {
                while (true) {
                    try {
                        InetAddress host = InetAddress.getByName("localhost");
                        try {
                            Scanner input = new Scanner(System.in);
                            String in = input.nextLine();
                            System.out.println(in);
                            StringBuffer str = new StringBuffer("");
                            str.append("Via: ");
                            str.append(sname + "\n");
                            str.append("To: " + sname + "\n");
                            str.append("From: " + name + "\n");
                            str.append("Body: " + in);
                            byte[] data = new byte[1000];
                            data = str.toString().getBytes("UTF-8");
                            DatagramPacket sendPack = new DatagramPacket(data, data.length, host, 5050);
                            sock.send(sendPack);
                        } catch (Exception e) {
                            System.out.println(e);
                        }
                    } catch (UnknownHostException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }

        };
        send.start();
        accept = new Thread() {

            public void run() {
                while (true) {
                    try {
                        sock = new DatagramSocket(5050);
                        byte[] data = new byte[1000];
                        pack = new DatagramPacket(data, data.length);
                        sock.receive(pack);
                        String incoming = new String(data, "UTF-8");
                        String s1 = incoming.replaceAll("\n", " ");
                        StringTokenizer st = new StringTokenizer(s1, " ");
                        while (st.hasMoreTokens()) {
                            String s2 = st.nextToken();
                            if (s2.equals("From:")) {
                                s2 = st.nextToken();
                                StringTokenizer namefind = new StringTokenizer(s2, "$");
                                sender = namefind.nextToken();
                            } else if (s2.equals("Body:")) {
                                s2 = st.nextToken();
                                while (st.hasMoreTokens()) {
                                    message = st.nextToken();
                                }
                            }
                        }
                        System.out.println(sender + " says: " + message);
                    } catch (UnknownHostException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (SocketException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        accept.start();
    }
}

public static void main(String[] args) throws IOException {
    String str[] = {"Java", "Client", "Sheba", "12345", " 127.0.0.1", "NetworkingAssignmentServer"};
    new Client(str);
}

}

但是我总是遇到错误,例如:

Exception in thread "main" java.net.BindException: Address already in use: Cannot bind
at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
at java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:84)
at java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:93)
at java.net.DatagramSocket.bind(DatagramSocket.java:392)
at java.net.DatagramSocket.<init>(DatagramSocket.java:242)
at java.net.DatagramSocket.<init>(DatagramSocket.java:299)
at java.net.DatagramSocket.<init>(DatagramSocket.java:271)
at ChatBox.Client.<init>(Client.java:44)
at ChatBox.Client.main(Client.java:140)
C:\Users\HP\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53:          Java returned: 1
BUILD FAILED (total time: 0 seconds)

我应该怎么办?任何帮助将非常感激。

用户名

我注意到服务器代码和客户端代码都使用相同的端口5050,当它们位于同一台PC上时,绑定将返回错误。

因此,您应该将不同的端口连接到服务器和客户端。或者,您可以使用其他PC分别运行服务器和客户端。

在此语句中放入不同的内容:

sock = new DatagramSocket(5050); // Server : 5050, Client 5000

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

一台服务器多客户端C / C ++

来自分类Dev

Java套接字:一台服务器和多个客户端

来自分类Dev

MongoDB架构一台服务器多个客户端C#

来自分类Dev

每个客户端(在一台服务器上)的登录页面不同

来自分类Dev

将多个客户端连接到一台服务器

来自分类Dev

如何使用nodejs将客户端/用户从一台服务器反向代理到另一台服务器?

来自分类Dev

具有一台服务器和21个客户端的小型网络中的最佳IP配置

来自分类Dev

Android客户端-Java服务器:一台服务器可以同时支持多少个客户端?

来自分类Dev

MongoDB体系结构一台服务器多个客户端C#

来自分类Dev

Java-是否可以将客户端发送到另一台服务器?

来自分类Dev

在Windows Phone 8.1上对多个客户端一台服务器进行套接字编程

来自分类Dev

Zookeeper 客户端会话将超时或传输到另一台服务器?

来自分类Dev

ZeroMQ - 模拟多个客户端到一台服务器的标准套接字

来自分类Dev

客户端向tcp服务器发送数据,tcp服务器向另一台服务器发送数据

来自分类Dev

在一台机器上模拟的服务器和客户端网络应用

来自分类Dev

Oracle Coherence的新增功能,试图将数据放入缓存中,两台机器一台服务器一个客户端

来自分类Dev

一台计算机中的服务器-客户端

来自分类Dev

在同一台服务器上使用带有 64 位 oracle 客户端的 php 7.3.4 64 位和带有 32 位 oracle 客户端的 php 7.3.4 32 位

来自分类Dev

用PHP下载“双向代理”吗?(一台服务器提供文件,并用客户端数据ping通另一台服务器)

来自分类Dev

用PHP下载“双向代理”吗?(一台服务器提供文件,并使用客户端数据ping通另一台服务器)

来自分类Dev

如何在同一台快递服务器上同时运行客户端和API?

来自分类Dev

使用JAX-RS(RESTEasy)作为中间件:将客户端的请求代理到另一台服务器

来自分类Dev

套接字编程将多个客户端连接到一台服务器并列出它们C

来自分类Dev

如何为每个客户端获取一台DCOM服务器

来自分类Dev

如何为每个客户端获取一台DCOM服务器

来自分类Dev

一台客户端断开连接后服务器关闭(JAVA)

来自分类Dev

在单个端口上制作多客户端udp服务器的最佳方法

来自分类Dev

聊天服务器和客户端实现?

来自分类Dev

聊天服务器和客户端实现

Related 相关文章

  1. 1

    一台服务器多客户端C / C ++

  2. 2

    Java套接字:一台服务器和多个客户端

  3. 3

    MongoDB架构一台服务器多个客户端C#

  4. 4

    每个客户端(在一台服务器上)的登录页面不同

  5. 5

    将多个客户端连接到一台服务器

  6. 6

    如何使用nodejs将客户端/用户从一台服务器反向代理到另一台服务器?

  7. 7

    具有一台服务器和21个客户端的小型网络中的最佳IP配置

  8. 8

    Android客户端-Java服务器:一台服务器可以同时支持多少个客户端?

  9. 9

    MongoDB体系结构一台服务器多个客户端C#

  10. 10

    Java-是否可以将客户端发送到另一台服务器?

  11. 11

    在Windows Phone 8.1上对多个客户端一台服务器进行套接字编程

  12. 12

    Zookeeper 客户端会话将超时或传输到另一台服务器?

  13. 13

    ZeroMQ - 模拟多个客户端到一台服务器的标准套接字

  14. 14

    客户端向tcp服务器发送数据,tcp服务器向另一台服务器发送数据

  15. 15

    在一台机器上模拟的服务器和客户端网络应用

  16. 16

    Oracle Coherence的新增功能,试图将数据放入缓存中,两台机器一台服务器一个客户端

  17. 17

    一台计算机中的服务器-客户端

  18. 18

    在同一台服务器上使用带有 64 位 oracle 客户端的 php 7.3.4 64 位和带有 32 位 oracle 客户端的 php 7.3.4 32 位

  19. 19

    用PHP下载“双向代理”吗?(一台服务器提供文件,并用客户端数据ping通另一台服务器)

  20. 20

    用PHP下载“双向代理”吗?(一台服务器提供文件,并使用客户端数据ping通另一台服务器)

  21. 21

    如何在同一台快递服务器上同时运行客户端和API?

  22. 22

    使用JAX-RS(RESTEasy)作为中间件:将客户端的请求代理到另一台服务器

  23. 23

    套接字编程将多个客户端连接到一台服务器并列出它们C

  24. 24

    如何为每个客户端获取一台DCOM服务器

  25. 25

    如何为每个客户端获取一台DCOM服务器

  26. 26

    一台客户端断开连接后服务器关闭(JAVA)

  27. 27

    在单个端口上制作多客户端udp服务器的最佳方法

  28. 28

    聊天服务器和客户端实现?

  29. 29

    聊天服务器和客户端实现

热门标签

归档