当前位置: 首页 > 知识库问答 >
问题:

多线程Udp套接字编程

蒯翰墨
2023-03-14

这是我的客户端和服务器的代码。

class Client1{Client1(int no){try{String message;message=“Hello this is client”+no;byte[]b=message.getBytes();DatagramPacket dp=new DatagramPacket(b,b length,inetAddress.getLocalHost(),3700);DatagramSocket sender=new DatagramSocket();sender.send(dp);}catch(异常e){system.out.println(“客户端关闭”);}}}

则我的服务器类是

class Server1{

int cnt=0;
String s1;
Server1()
{

    try {
            byte[] buffer = new byte[65536];
            DatagramPacket  incoming = new DatagramPacket(buffer, buffer.length);
            DatagramSocket  ds = new DatagramSocket(3700);
            ds.receive(incoming);
            byte[] data = incoming.getData();
            String s = new String(data, 0, incoming.getLength());
            System.out.println("Port" + incoming.getPort() + " on " + incoming.getAddress() + " sent this message:");

            System.out.println(s.toUpperCase());
            }

            catch (IOException e) 
            {
            System.err.println(e); 
            }
}   

}

那么我的可运行实现是

类prothread实现Runnable{

//long time=0;
    //int portno;
    int flag=0; // this is to differentiate between a server and client
    private String capitalizedSentence;
prothread(long l)
{
    if(l==1)
        { // it is a server
            flag=1;
        }
        else
        {
            flag=(int) l;
        }
}

@Override
public void run(){
    // TODO Auto-generated method stub

        System.out.println("Starting thread");    
        if(flag==1)// Code for server
            {
           Server1 s=new Server1();

            }
            else   // code for client
            {                   
              Client1 c=new Client1(flag);

             }

    }

}

最后,部署此客户端和服务器的类是

公共类Samplepro31{

public static void main(String[] args) {
    // First i'm going to create a server and then clients for it
        int i=1;
        int cnt=0;

         prothread[] p;
        Thread[] th;
        Random r =new Random();
         // Array has been declared 
        p=new prothread[10];// Memory allocated to it
        th= new Thread[1000];
        p[0]=new prothread(1);
        cnt=1;
        //p[0].setportno(cnt);
        th[0]=new Thread(p[0]);
        th[0].start();
        while(cnt<3)
        {

                p[cnt]=new prothread(cnt); 
                // here send the port number
                th[cnt]=new Thread(p[cnt]);
                //p[cnt1].setportno(cnt1);
                th[cnt].start();
                cnt++;
        }

  }

}

所以我遇到的问题是一个服务器同时只有一个客户端在运行,而不是两个客户端在运行,我得到的O/P是:

启动线程启动线程启动线程在Clinet的构造函数2内部java.net.bindexception:Address已经在使用:无法绑定HELLO这是客户端2

有人能告诉我我做错了什么吗?

共有1个答案

龚星洲
2023-03-14

不要将客户端绑定到任何特定端口。让实现选择要绑定到的可用端口。

 类似资料:
  • 为了实现这一点,我使用了队列/线程池机制。最初,我创建一个固定数量线程的池,并有一个队列datastructure来存储客户机地址。这个队列在所有线程之间共享,因此我使用“互斥”来锁定/解锁这个队列。在主服务器线程中,我创建一个套接字,将其绑定到全局端口/地址,然后在“recvfrom”调用上阻止服务器。任何希望与服务器通信的客户端都会向侦听全局端口地址的主线程服务器发送“HI”消息。主服务器线程

  • 我是Java和JavaFX的新手,所以请原谅我的新手问题。在过去的几天里,我一直在寻找我正在努力做的事情的例子,但是没有找到任何答案。下面是我正在尝试做的:我试图创建一个简单的javafx GUI客户端套接字应用程序,使用场景生成器连接到服务器并发送/接收数据。很简单,但是当我试图在JavaFX中实现它时,我的图形用户界面冻结了。我研究发现,原因是套接字通信占用了所有的时间,javafx GUI无

  • 我有一个类似的问题,但是我知道当我要求阅读一行时,发件人应该发送一个行尾。 让我困惑的是,在调试中,它是有效的。可能是因为我在调试时跳过的顺序(直到现在我都不知道这会有什么不同),但我想更好地理解它。 我已经使用线程,但不是很多。 这是我的服务器类: 线程(基于此) 和客户: 它似乎在某个地方进入了死锁,出于某种原因,除非在调试中运行,否则永远不要在向客户端发送数据的服务器类上输入该死锁 (顺便说

  • 本文向大家介绍在Python中使用多线程进行套接字编程?,包括了在Python中使用多线程进行套接字编程?的使用技巧和注意事项,需要的朋友参考一下 多线程概念 多线程是几乎所有现代编程语言(尤其是python)的核心概念,因为它的线程实现简单。 线程是程序内的子程序,可以独立于代码的其他部分执行。线程在同一上下文中执行,以共享程序的可运行资源(如内存)。 当在一个进程中,我们同时执行多个线程时,称

  • 我写了一个简单的udp服务器客户端应用程序与多播套接字。服务器每6毫秒向三个客户端发送数据包。数据包大小为1200字节。这是每秒166,66个数据包。每当其中一个客户端检测到丢失的数据包时,它将通过单播向服务器发送NACK数据包。 第一个测试:服务器和三个客户端通过以太网连接到路由器TP链路TL-WDR4300(dd wrt),一切正常。 第二次测试:只有服务器通过以太网连接到路由器,其他客户端通

  • 问题内容: 如果我有多个Java线程同时写入同一Socket实例,这会影响从同一套接字读取的对象的完整性吗?即,对象的内容是否会被弄乱等等。对象的顺序可以是随机的。 问题答案: 通常,没有任何保证。一点点不同的对象很可能最终会在电线上交错,使结果难以辨认。 因此,您需要提供外部同步。 有趣的是,即使在OS级别进行单个套接字写入也不一定是原子操作。有关进一步的讨论,请参见注意sendmsg()系列函