vs实现UDP多点通信问题

在vs2018下用C++开发exe程序,如何实现UDP接收多个IP及发送给多个IP。

接收和发送同时进行

5个回答

1,首先需要建立socket 连接,通过多线程来进行UDP的发送,及接收。
2,程序需要有高并发要求吗?我有代码。
3,如有问题欢迎讨论,1016493379@qq.com

socket编程的基础要有,baidu或者google,一搜一大堆;
既然使用udp了 如果在局域网环境下 简单的可以考虑使用udp组播技术来实现,但是组播实际用起来不一定特别稳定就是了;
如果不使用组播或者在广域网环境下,可以创建一个用户类或结构体,成员包括ip和端口等信息,使用数组或链表来来管理;
使用多线程维持多个udp链接,接收到某个链接来的数据的时候,再开启新的线程来发送给用户数组或链表里的多个用户。。。

UDP socket编程socket()/sendto/recvfrom()接收/上发送数据。

通过发送一段Udp指令,来获取连在同一个局域网的多台设备的ip,服务器端返回确认的数据。

发送和接受分别用一个线程来。之后将收到的消息或者发送的消息,存入队列里面。这个队列由另一个线程来控制。队列取得消息,并根据每个消息的特点,来进行响应。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
vxworks 下workbench3.3 上实现udp 通信 只能发送,不能接收的问题?

我是在VMware 上装的xp ,之后在xp 上安装的workbench3.3 。 需要用C++ 编写一个类,实现udp socket 通信,自己编写的程序是实现服务器功能,和TCP&UDP测试工具进行通信,自己的程序只能给测试工具发送消息,接收进程一直显示pend .自己编写的程序和TCP&UDP测试工具都是在此虚拟机安装的XP上运行的。 代码类大概如下: class Socket{ public: Socket(); recvmes(){int nev = recvfrom();} ........ }; 有没有知道这方面的大神给个建议。指导一下。

UDP通信问题,时通时不通

服务器用的UDP通信,多个客户端,现在问题是服务器跟一部分客户端通信没有问题,而只能收到另一部分客户端的数据,服务器回复了应答,但是客户端接收不到应答,这一部分客户端有时又可以正常通行,这样的问题怎么处理,怎么定位?

如何实现udp的并发,要求使用多播

基于linux c udp协议下的并发服务器,要求多线程加组播技术

UDP多点广播,有办法判断MulticastSocket的receive方法当前是否处于阻塞状态吗?

在接收广播的时候,如果服务端没有开启的话,receive方法会进入阻塞状态。我想通过获取当前的状态添加一个提示。 不然在客户端开启,服务端没开启的情况下,客户端就一直等待,也没个提示,这种体验很不好。

如何在主站和从站进行ethercat通信的同时实现组展和从站间的tcp udp通信呢

如何在主站和从站进行ethercat通信的同时实现组展和从站间的tcp udp通信呢,phy是经过了从站芯片的,感觉不能再去实现tcp udp通信了

win7 下进行UDP通信测试发现UDP服务器无法接收到CLIENT的发送数据这是啥原因?

进行UDP数据通信的时候,UDP的客户端用WIRESHARK抓包,能很明显的看到数据发出来了,数据格式也是正确的,但是服务那边的就是接受不到数据,接受卡在接受哪里不动了。查看防火墙,防火墙也是关了的;该程序在WINXP下通信都是正确的,哪位大侠能给下解决方案?总觉得是WIN7在哪里设置有问题;另外我查看QQ的设置,开放该应用程序的UDP协议为开放所有协议,还是不行。

关于java的UDP通信问题。。。。。。。

我建立了两个客户端和一个服务端,一个客户端发消息给服务器,然后服务器转发给另一个客户端。问题是这样的,客户端1发了一个消息1给服务器然后转发给客户端2,然后这时候要是客户端2要给客户端1发个消息2的话,客户端1却是收到刚刚发出去的消息1,客户端2再发消息的时候就正常了,消息2不知道哪里去了,调试的时候客户端2发的消息2是有传送到服务器的,可是服务器再发出去的时候就变了 ![图片说明](https://img-ask.csdn.net/upload/201711/26/1511695595_978945.png) 服务器程序: import java.net.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.*; import java.sql.*; public class UDPServerService { /** * @param args the command line arguments */ public static void main(String[] args) throws SQLException { // TODO code application logic here // if(args.length<1) // { // System.out.println("请输入用于mail服务的本地端口号"); // System.exit(0); // } int i=8000; // String s=Integer.toString(i); UDPServerThread myUDPServer=new UDPServerThread(8000);//创建邮件服务器监听线程 myUDPServer.init(); Thread th=new Thread(myUDPServer); th.start(); } } class UDPServerThread extends Frame implements Runnable { private DatagramSocket UDPServerSocket=null,UDPServerSocket1=null; PreparedStatement ps; TextArea ta=new TextArea(10,50); JButton close; Connection con; Statement stmt; ResultSet rs; String sql; int flag=0; int ports; void init(){ close=new JButton("close"); setTitle("服务监听器"); setSize(400,300); setLayout(new FlowLayout()); add("center",ta); add(close); close.addActionListener(new Close()); setVisible(true); } UDPServerThread(int Port){ ports=Port; try{ UDPServerSocket=new DatagramSocket(Port); UDPServerSocket1=new DatagramSocket(Port+1); ta.append("邮件服务监听器在端口"+UDPServerSocket.getLocalPort()+"\n"); }catch(Exception e){ System.err.println(e); } } public void run(){ if(UDPServerSocket==null) return; while(true){ try{ byte[] dataBuf=new byte[512]; DatagramPacket ServerPacket; InetAddress remoteHost; int remotePort; String datagram,s; ServerPacket =new DatagramPacket(dataBuf,512); UDPServerSocket.receive(ServerPacket);//接受 remoteHost=ServerPacket.getAddress(); remotePort=ServerPacket.getPort(); datagram=new String(ServerPacket.getData()); String sql="SELECT * FROM biao1"; try{ Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); con=DriverManager.getConnection("jdbc:ucanaccess://D:\\access\\db1.mdb","",""); stmt=con.createStatement(); rs=stmt.executeQuery(sql); }catch(Exception e1){ e1.printStackTrace(); } if(datagram.contains("#dl#")){ while(rs.next()){ //验证帐号密码是否正确 if((datagram.indexOf(rs.getString("username"))!=-1)&&(datagram.indexOf(rs.getString("password")))!=-1){ String pass="connect"; dataBuf=pass.getBytes(); ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort); UDPServerSocket.send(ServerPacket); ta.append("用户"+remoteHost+"已登录"+'\n'); flag=1; sql="UPDATE biao1 SET connection=? WHERE username=?"; ps=con.prepareStatement(sql); ps.setInt(1,1); ps.setString(2, rs.getString("username")); ps.executeUpdate(); //表1中设置该用户为在线状态 sql="UPDATE biao1 SET remoteHost=? WHERE username=?"; ps=con.prepareStatement(sql); ps.setString(1,remoteHost.toString()); ps.setString(2, rs.getString("username")); ps.executeUpdate(); sql="UPDATE biao1 SET remotePort=? WHERE username=?"; ps=con.prepareStatement(sql); ps.setInt(1, remotePort); ps.setString(2, rs.getString("username")); ps.executeUpdate(); //修改表中用户的登录地址,登录端口 con.commit(); con.close(); } } if(flag==0){ String lost="lost"; dataBuf=lost.getBytes(); ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort); UDPServerSocket.send(ServerPacket); } } else{ sql="SELECT * FROM biao1"; ResultSet rt; rt=stmt.executeQuery(sql); int port=0; //ta.append('\n'+"收到如下主机发来的邮件"+remoteHost.getHostName()+":\n"+datagram); while(rt.next()){ if(datagram.indexOf(rt.getString("username"))!=-1){ if(rt.getString("connection").indexOf("1")!=-1){ InetAddress remoteHost1=InetAddress.getByName(rt.getString("remoteHost").substring(1)); int remotePort1=rt.getInt("remotePort"); port=remotePort1+1; dataBuf=new byte[512]; dataBuf=datagram.getBytes(); System.out.print(datagram); ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost1,port); UDPServerSocket1.send(ServerPacket); } else{ datagram=new String("unconnect."); dataBuf=new byte[512]; //remoteHost=InetAddress.getByName("QH-20150828KDPO"); dataBuf=datagram.getBytes(); ServerPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort); UDPServerSocket.send(ServerPacket); } } } } }catch(Exception e){ System.err.println(e); } } } protected void finalize(){ if(UDPServerSocket!=null){ UDPServerSocket.close(); UDPServerSocket=null; ta.append("关闭服务器端的数据报连接!"); } } } class Close implements ActionListener{ public void actionPerformed(ActionEvent e){ System.exit(0); } } 客户端程序: import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import static java.lang.Thread.sleep; import java.util.Scanner; import java.sql.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; public class UDPClientService1 { /** * @param args the command line arguments */ public static void main(String[] args){ // TODO code application logic here Dl d=new Dl(args); } } class UDPClientService extends Frame implements ActionListener,Runnable{ DatagramSocket UDPClientSocket; DatagramPacket ClientPacket; InetAddress remoteHost; int remotePort; byte[] dataBuf; String datagram; private String send=""; String args[]=new String[3]; Scanner in; TextArea ta_receive=new TextArea(10,60),ta_send=new TextArea(5,60); JButton ok=new JButton("ok"),close =new JButton("close"),test=new JButton("test"); JPanel p3=new JPanel(),p1=new JPanel(),p2=new JPanel(); void Init_Frame(){ setTitle("服务器端口1"); setSize(500,450); setLayout(new BorderLayout()); ta_receive.setEditable(false); ta_send.requestFocus(); add(p1,BorderLayout.NORTH); add(p2,BorderLayout.CENTER); add(p3,BorderLayout.SOUTH); p1.add(ta_receive); p2.add(ta_send); p3.add(ok); p3.add(close); p3.add(test); ok.addActionListener(this); close.addActionListener(this); test.addActionListener(this); setVisible(true); } void Init(String args[]){ this.args=args; if(args.length<3){ ta_receive.append("请输入本地端口号,远程服务器主机号及端口名"); System.exit(0); } try{ UDPClientSocket =new DatagramSocket(Integer.valueOf(args[0])+1); remoteHost=InetAddress.getByName(args[1]); remotePort=Integer.parseInt(args[2]); }catch(Exception e){ System.err.println(e); } } public void run(){ while(true){ try { dataBuf=new byte[512]; ClientPacket=new DatagramPacket(dataBuf,512); UDPClientSocket.receive(ClientPacket);//接受 datagram=new String(ClientPacket.getData()); System.out.print(datagram); ta_receive.append('\n'+"Server:"+'\n'); ta_receive.append(" "+datagram+'\n'); } catch (IOException ex) { Logger.getLogger(UDPClientService.class.getName()).log(Level.SEVERE, null, ex); } } } public void actionPerformed(ActionEvent e){ if(e.getSource()==ok){ try{ in=new Scanner(ta_send.getText()); //int port=Integer.valueOf(args[0])+2; ta_receive.append('\n'+"Client:"+'\n'+""+ta_send.getText()+'\n'+'\n'); // UDPClientSocket1 =new DatagramSocket(port); datagram=send+in.nextLine(); dataBuf=datagram.getBytes(); ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort); UDPClientSocket.send(ClientPacket);//发送 ta_send.setText(""); }catch(IOException e1){ System.err.println(e1); } } else if(e.getSource()==close){ dispose(); System.exit(0); } else if(e.getSource()==test){ send="lijing"; } } } class Dl extends Frame implements ActionListener{ JTextField t1=new JTextField(10),t2=new JTextField(10); JButton ok=new JButton("ok"),close=new JButton("close"); JLabel l=new JLabel("tips"),username1=new JLabel("username"),password1=new JLabel("password"); String args[]=new String[3]; Panel p1=new Panel(),p2=new Panel(),p3=new Panel(),p4=new Panel(); private String name,password,s; DatagramSocket UDPClientSocket; DatagramPacket ClientPacket; InetAddress remoteHost; int remotePort; byte[] dataBuf; String datagram; String flags="#dl#"; Dl(String args[]){ this.args=args; try{ UDPClientSocket =new DatagramSocket(Integer.parseInt(args[0])); remoteHost=InetAddress.getByName(args[1]); remotePort=Integer.parseInt(args[2]); }catch(Exception e){ System.err.println(e); } setLayout(new BorderLayout()); setSize(200,150); p1.add(username1); p1.add(t1); p1.add(password1); p1.add(t2); p1.add(ok); p1.add(close); p2.add(l); add(p1,BorderLayout.CENTER); add(p2,BorderLayout.SOUTH); ok.addActionListener(this); close.addActionListener(this); setVisible(true); } public void actionPerformed(ActionEvent e){ if(e.getSource()==ok){ try{ name=t1.getText(); password=t2.getText(); s=flags+name+password; dataBuf=s.getBytes(); ClientPacket=new DatagramPacket(dataBuf,dataBuf.length,remoteHost,remotePort); UDPClientSocket.send(ClientPacket);//发送 dataBuf=new byte[512]; ClientPacket=new DatagramPacket(dataBuf,512); UDPClientSocket.receive(ClientPacket);//接受 datagram=new String(ClientPacket.getData()); if(datagram.contains("connect")){ UDPClientService ucs=new UDPClientService(); ucs.Init_Frame(); ucs.Init(args); setVisible(false); Thread th=new Thread(ucs); th.start(); } else{ l.setText("error!!"); } }catch(IOException e1){ System.err.println(e1); } } else if(e.getSource()==close){ dispose(); System.exit(0); } } }

为什么代码正确,却不能实现UDP之间的通信呢?是不是电脑要设置什么还是怎么的?求大神解决哟.

public class UdpRece { public static void main(String[] args) throws Exception{ //1.定义Socket DatagramSocket ds = new DatagramSocket(10088); //2.创建数据包 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //3.接受数据 ds.receive(dp); //解析数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip); System.out.println(data); System.out.println(port); ds.close(); } } public class UdpSend { public static void main(String[] args)throws Exception { //1,创建udp服务。通过DatagramSocket对象。 DatagramSocket ds = new DatagramSocket(8888); //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) /*InetAddress ia = InetAddress.getLocalHost(); System.out.println(ia); InetAddress ia1 = InetAddress.getByName("SKY-20170715YUU"); System.out.println(ia1.getHostAddress());*/ byte[] buf = "udp ge men lai le ".getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.0.107.243"),10088); //3,通过socket服务,将已有的数据包发送出去。通过send方法。 ds.send(dp); //4,关闭资源。 ds.close(); } }

请教一个通过tornado,实现udp和http同时通信的问题

我需要用tornado来做一个手机远程控制家电的程序,手机用http请求,与底下家电通信用udp,同时监听两种协议的端口呢?

实现UDP在互联网上打洞通信的问题。

实现UDP在互联网上打洞通信,公网服务器记录客户端的公网IP,当客户端给客户端发送打洞消息时 由于运营商路由选择了别的线路,导致IP和服务器记录的不一样,导致打洞失败。要求是要解决这类问题,或者有其他好的办法。

关于Android利用局域网进行UDP通信的问题

我写了一个小程序准备利用UDP和电脑之间进行通信,然后基于这个做一点东西,可是问题是我用AVD测试很好用的,但是用真机测试就是不行。 我的思路是让电脑和Android设备连接一台路由器,路由器为两台设备分配固定的ip地址进行通信。 拜托大家帮我看看啊,我这才是第一步就郁闷的要死 下面是代码。 1:MainActivity package com.company.zebork.testudpll; import android.app.Activity; import android.content.Context; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity { EditText text; Button send; Handler handler; Message msg; EditText ad; String address; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (EditText) findViewById(R.id.editText); send = (Button) findViewById(R.id.send); ad = (EditText) findViewById(R.id.editText2); handler = new Handler() { @Override public void handleMessage(Message msg) { text.setText(""); } }; /* send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.handleMessage(msg); } });*/ send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println(ad.getText().toString()); AsyncTask<String ,String , Void> toSend = new AsyncTask<String, String, Void>() { @Override protected Void doInBackground(String... params) { address = ad.getText().toString(); UDPClient client = new UDPClient(address); System.out.println("here" + address); client.send(text.getText().toString()); msg = new Message(); handler.sendMessage(msg); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } }.execute(address); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 2、UDPClient package com.company.zebork.testudpll; import java.io.IOException; import java.net.*; public class UDPClient { private DatagramPacket dp; private DatagramSocket ds; private byte[] buf; private String address; public UDPClient(String address) { buf = new byte[4096]; this.address = address; System.out.println("??" + address); try { ds = new DatagramSocket(8888); } catch (SocketException e) { e.printStackTrace(); } } public void send(String str) { buf = str.getBytes(); try { dp = new DatagramPacket(buf, buf.length,new InetSocketAddress(address,5679)); ds.send(dp); ds.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 3、AndroidManifest【有些权限我都没有用到,因为调试这个错误才加上的】 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.zebork.testudpll" > <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 4、activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_gravity="center_horizontal" android:text="ip" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送" android:id="@+id/send" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:layout_gravity="center_horizontal" /> </LinearLayout> 5、服务器的Java文件,我是用JavaSE写的,因为不会javaEE import java.io.IOException; import java.net.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TestUDPClient extends Frame{ private static DatagramPacket dp; private static DatagramSocket ds; private static TextField text; private static TextArea ta; public static void main(String[] args) { Frame f = new TestUDPClient(); f.setLocation(200, 200); f.setSize(300,200); f.setVisible(true); text = new TextField(); ta = new TextArea(); f.add(text,BorderLayout.SOUTH); f.add(ta,BorderLayout.CENTER); f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if(ds!=null) ds.close(); System.exit(0); } }); startServer(); } public static void startServer() { byte[] buf = new byte[4096]; dp = new DatagramPacket(buf,buf.length); try { ds = new DatagramSocket(5679); } catch (SocketException e) { e.printStackTrace(); } while(true) { try { ds.receive(dp); if(ta.getText().length() > 0) ta.setText(ta.getText() + "\n" + new String(buf,0,dp.getLength())); else ta.setText(new String(buf,0,dp.getLength())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

MfC网络编程实现非阻塞、多对一的、C/S结构的UDP通信

功能需求如题,目前用了WSAAsyncSelect,实现了非阻塞,但是当第二个客户端上线时,服务器没有响应,在实现tcp版的WSAAsyncSelect时,是创建了一个新的套接字来accept,但是udp通信不需要listen和accept,当第二个用户上线时,绑定在该端口上的套接字正在被第一个使用,第二个用户怎么办? 希望大神们指点一下!

simulink中实现UDP数据包的接收与发送

就是我现在有一个设备,它把它测量得到哦哦数据通过UDP协议传送给电脑,本来它自己有一个软件可以通过UDP端口来抓取发送过来的UDP报文,然后进行解算利用。但是现在我想自己通过simulink来抓取这个报文。然后在simulink里提取报文里面的内容,将提取得到的内容输入到我后面的模型当中。但现在我不知道该怎么通过simulink来抓取这个UDP报文,有人能够指点一下吗?

java 中用多线程实现 UDP 传输的问题

我用多线程实现了发送数据和接收数据的 UDP 传输 但是结果很奇怪,第一次键盘输入后传输过来的数据是正常的 但往后的数据传输结果就开始变得很奇怪,总是莫名其妙多出很多字母![图片说明](https://img-ask.csdn.net/upload/201909/10/1568129293_920283.png) 但是我是跟着视频写的代码,我把视频里的代码复制过来也是这么回事,是不是 java 版本的问题??我的java是最新版的 以下是代码部分,请各位大神不吝赐教,谢谢! ``` public class Demo5_Thread { public static void main(String[] args) { new Receive().start(); new Socket().start(); } } //发送方 class Socket extends Thread { public void run() { try { Scanner sc = new Scanner(System.in); DatagramSocket socket = new DatagramSocket(); while (true) { String line = sc.nextLine(); if ("quit".equals(line)) { break; } DatagramPacket packet = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("10.24.3.58"), 666); socket.send(packet); } socket.close(); } catch (IOException e) { e.printStackTrace(); } } } //接收方 class Receive extends Thread{ public void run() { try { DatagramSocket socket = new DatagramSocket(666); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); while (true) { socket.receive(packet); String ip = packet.getAddress().getHostAddress(); int port = packet.getPort(); byte[] arr = packet.getData(); int len = packet.getLength(); System.out.println(ip + ":" + port + ":" + new String(arr, 0, len)); } } catch (IOException e) { e.printStackTrace(); } } } ```

java用udp进行服务器通信,做聊天程序

java用udp进行服务器通信,做聊天程序,怎么将接收方的信息,放在发送内容里面来完成。tcp模式可以用序列化方式来完成,udp用什么方法,必须用正则方法,来找出接收方信息吗。

udp外网服务通信问题?????

大家好,新人一枚,现在在本机写了一个udp服务用来接收模组发送的数据,用外网ip和端口映射到本机了,但是接收不到数据,求大神解惑,谢谢!

UDP跨路由器通信,客户端无法收到服务端发送的UDP包

本人新手,正做一个UDP跨路由通信项目,遇如下问题:服务端(192.168.0.85)与路由器在同一网段,客户端(192.168.1.103)在该路由器组成的局域网内,现服务端可以接收到客户端发送的UDP包,但客户端无法收到服务端的UDP包。请问客户端发送的UDP包需怎样设置(IP/端口)? (PS:服务端与客服端在同一局域网内是可以UDP通信的) 以下是我的UDP设置 客户端--目标IP:192.168.0.85----目标端口10000----绑定发送端口9999----监听端口8888 服务端--目标IP:192.168.1.103----目标端口8888----绑定发送端口9999----监听端口10000 服务端可以正常接收客服端发过来的包,解析为:192.168.0.129:9999 个人认为192.168.0.129可视为路由器对外IP,但路由器发送UDP包的端口是9999吗????网上有帖子说将路由器的这个IP和端口作为服务器发送的UDP包里的目标IP/目标端口,将UDP包发给路由,然后路由器会自动转发给客户端。请问是正确的吗??? 求大神指教,谢谢!

通过gevent实现UDP多任务出现的问题。

在运行代码时,如果控制台上一直不输入内容,那么从网络调试器发送过来的消息就会一直堵着而不会打印出来,只有等控制台向网络调试器发送消息后堵着的消息才会全部显示,这是为什么呢?本人小白,请大侠指教。。。谢谢啦。。。 ``` import socket import gevent from gevent import monkey monkey.patch_all() def recv(udp_socket): while True: recv_data= udp_socket.recvfrom(1024) print(recv_data[1],":",recv_data[0].decode("utf-8")) def send(udp_socket,client_addr): while True: send_data= input("请输入要发送的消息:") gevent.sleep(5) udp_socket.sendto(send_data.encode("utf-8"),client_addr) def main(): udp_socket= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) client_addr= ("127.0.0.1",7788) udp_socket.bind(("127.0.0.1",8080)) g1=gevent.spawn(recv,udp_socket) g2=gevent.spawn(send,udp_socket,client_addr) gevent.joinall([g1,g2]) udp_socket.close() if __name__ == "__main__": main() ```

关于Java网络通信_UDP的几个问题

UDP发送端:<br> DatagramPacket dp=new DatagramPacket(buf, length, address, port);<br> 其中,buf指所需要发送的数据,length指的是包的长度(官方文挡解释)。 问题1:若buf长度为很大,远大于length,那么上面的语句是将数据打包成一个数据丢失的数据包还是多个长度为length的数据包? <hr> UDP接收端:<br> DatagramSocket ds=new DatagramSocket(10086);<br> byte[] buf=new byte[1024];<br> int length=buf.length;<br> DatagramPacket p=new DatagramPacket(buf, length);<br> ds.receive(p);<br> 问题2:DatagramPacket用来接收长度为length的数据包,若发送端数据包长度为1024,接收端在此的length设为100,数据是否会丢失?<br> 问题3:receive(p)方法到底接收的是一个包还是所有的包?

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

ArrayList源码分析(入门篇)

ArrayList源码分析 前言: 写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

玩转springboot启动banner定义所得

最近接手了一个springboot项目,不是不熟悉这个框架,启动时打印的信息吸引了我。 这不是我熟悉的常用springboot的打印信息啊,我打开自己的项目: 还真是的,不用默认的感觉也挺高大上的。一时兴起,就去研究了一下源代码,还正是有些收获,稍后我会总结一下。正常情况下做为一个老程序员,是不会对这种小儿科感兴趣的,不就是一个控制台打印嘛。哈哈! 于是出于最初的好奇,研究了项目的源代码。看到

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

立即提问
相关内容推荐