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多点广播,有办法判断MulticastSocket的receive方法当前是否处于阻塞状态吗?

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

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

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

为什么代码正确,却不能实现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(); } }

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

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

UDP通信问题,时通时不通

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

UDP广播通信中多次使用select函数会不会让程序太复杂?

我现在在写无线令牌环协议代码,目前可以让节点之间相互通信。现在我要设置定时器,在定时器规定时间内收到广播信息就做相应动作1,若没有就做相应动作2。我想用select函数来控制,当超时就进入动作2,若没有超时套接字已准备好读取,就接收广播信息读取然后进入动作1.但是令牌环里面涉及到很多个这种情况,若都这样实现的话会不会产生混乱。有没有更好的方法?

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

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

关于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(); } } } }

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

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

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

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

JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下。。。。

本人是个接触JAVA2个月的菜鸟,最近在研究UDP广域网的通信,实现的过程也就是常说的双向通信:客户端(局域网内)先发数据给远方的服务器(服务器是公网IP,映射了个端口),服务器能收到,但是服务器不能回发数据给客户端。。。对于这方面的问题,在网上找了很多资料,全是局域网内的,网上说什么UDP打洞啊,穿透啊等等的,说实话有点晕,直到有一天在网上一个论坛看到同样类似的帖子,主人说根本就不需要什么UDP打洞这类的做法,只需要地址解析。。。。那么我想请问有没有什么方法来解决这个问题啊?此外,有个sockettools2调试工具,能在上面实现广域网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(); } } } ```

Udp通信,对方不断收到我的消息

做了一个小程序,输入ip和对方收发消息。TCP方式没有问题,但是UDP测试的时候有几个问题: 1、同样的程序,直接udp方式,输入了ip,我可以向对方发送消息,对方向我发送没反应 2、从tcp方式切换为udp方式,对方可以向我发送消息,但我向对方发送对方就会一直接受,程序崩溃 3、我是用同一个socket进行udp收发的,tcp和udp接收都放在OnReceive里面,根据选择的收发方式来选择。 4、自己测试的时候,一个socket接收,一个发送,发现OnReceive没有响应,同一个收发就可以,这是为什么 问题较多,初学者,不好意思。

C++ udp多线程socket实现一个server多个client间的通信

http://blog.csdn.net/chw1989/article/details/7453217 链接如上,想知道这篇文章里面提到的 能进行多机测试,但是运行的时候只能1为client,2为server并且不能实现循环处理数据,要想实现那些功能该怎么改

手游moba游戏 UDP通信 状态同步

手游moba游戏 UDP通信 状态同步一般同步哪些数据,包括坐标吗?(´・_・`)

socket编程实现UDP广播的问题

用socket实现UDP的广播时,sendto函数发送广播消息正常,但是其他vxsim的recvfrom函数未被调用,也就是说广播消息发出去了,但是其他vxsim都未接收到,这是怎回事?

关于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)方法到底接收的是一个包还是所有的包?

程序员的兼职技能课

程序员的兼职技能课

为linux系统设计一个简单的二级文件系统

实验目的: 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 实验要求: 为linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条)

CCNA+HCNA+wireshark抓包综合网工技能提升套餐

本套餐包含思科路由交换CCNA,部分CCNP核心,华为HCNA以及wireshark抓包等类容,旨在培养具有综合能力的网络工程师。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

成年人用得到的6款资源网站!各个都是宝藏,绝对让你大饱眼福!

不管是学习还是工作,我们都需要一些资源帮助我们有效地解决实际问题。 很多人找资源只知道上百度,但是你们知道吗,有的资源是百度也搜索不出来的,那么今天小编就给大家介绍几款好用的资源网站,大家赶紧收入囊中吧! 1.网盘007 https://wangpan007.com/ 一款全能的资源搜索网站!只需要输入关键字,就能获得你想要的视频、音乐、压缩包等各种资源,网上...

矿车轴载荷计算方法的比较及选用

针对矿车轴的弯曲损坏,分析了固定式矿车车轴的受力,并对力叠加法以及当量负荷法2种计算方法进行了分析和比较,认为应采用当量负荷法进行车轴的设计计算。

Python数据清洗实战入门

Python数据清洗实战入门

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

Polar编码matlab程序

matlab实现的Polar codes源程序

2019全国大学生数学建模竞赛C题原版优秀论文

2019全国大学生数学建模竞赛C题原版优秀论文,PDF原版论文,不是图片合成的,是可编辑的文字版。共三篇。 C044.pdf C137.pdf C308.pdf

Linux常用命令大全(非常全!!!)

Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 d...

Linux下聊天室实现(基于C)

在linux下的基于TCP/IP,采用socket通信的聊天室,实现进入聊天室,进行多人群聊,指定人进行私聊,群主管理员功能,颗进行禁言,提出群聊等操作。个人账号可修改昵称或者修改密码,还可进行找回密

一个较完整的Qt用户登录界面设计

一个较完整的Qt用户登录界面,稍微移植可用,用sqlite数据库存储用户名和密码,具有增加和删除用户的功能,开发环境为ubuntu16.04+Qt5.6.1,win7下程序也编译可用。贡献出来,共同学

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

【C语言】贪吃蛇游戏代码(Visual C++6.0实现)

本游戏代码参考《C语言项目开发全程实录(第二版)》第六章。代码已在Visual C++6.0环境下编译测试通过,可在VC++6.0编译器中导入工程编译运行查看效果,或者也可以直接运行Release或D

Android小项目——新闻APP(源码)

Android小项目——新闻APP(源码),一个很简单的可以练手的Android Demo Ps:下载之前可以先看一下这篇文章——https://blog.csdn.net/qq_34149526/a

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

Android音视频开发全套

Android平台音视频开发全套,涉及:FFmpeg软解码解码、Mediacodec硬解码编码、Openssl音频播放、OpenGL ES视频渲染、RTMP推流等核心重要知识点。

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

2019 Python开发者日-培训

2019 Python开发者日-培训

2019 AI开发者大会

2019 AI开发者大会

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

因为看了这些书,我大二就拿了华为Offer

四年了,四年,你知道大学这四年我怎么过的么?

Python可以这样学(第四季:数据分析与科学计算可视化)

Python可以这样学(第四季:数据分析与科学计算可视化)

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

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

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

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

DirectX修复工具V4.0增强版

DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复

C++语言基础视频教程

C++语言基础视频教程

相关热词 c# dbml文件 修改 c#遍历tree c# 能够控制单片机 c#对象写入数据库 c# 添加activex c#2005 json c# 数据库在云端 c# 字符串移位加密 c#禁用滚轮 c#实体类list去重复
立即提问