udp收不到,为什么
您好,大家们我从远程电脑发udp数据,但我收不到,为什么? 我给远程 机子我的ip地址了。。。。 本地运行没有问题。。。就从远程电脑收不到udp数据。。。。怎么解决? --------------------编程问答-------------------- 如果本地测试通过,那就是防火墙的问题,把你自己的防火墙关掉!
如果跨网络了,相应的防火墙也要开放端口. --------------------编程问答-------------------- 防火墙,再过UPD本来就是一种不稳定的协议包,不一定全部能收到 --------------------编程问答--------------------
恩 防火墙怎么解决?
我的发udp代码:
try {
int port = 7777;
byte[] msg = chattext.getText().getBytes();
// Get the internet address of the specified host
InetAddress address = InetAddress.getByName("124.126.176.80");//my pc`s ip adress
// Initialize a datagram packet with data and address
DatagramPacket packet = new DatagramPacket(msg, msg.length,
address, port);
packet.getPort();
// Create a datagram socket, send the packet through it, close it.
DatagramSocket dsocket = new DatagramSocket();
dsocket.send(packet);
dsocket.close();
} catch (Exception e) {
e.printStackTrace();
}
udp接受代码:
try {
int port = 7777;
InetAddress address = InetAddress.getLocalHost();
DatagramSocket dsocket = new DatagramSocket(port, address);
byte[] buffer = new byte[65000];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// Now loop forever, waiting to receive packets and printing them.
while (true) {
dsocket.receive(packet);
String longtex=new String(buffer, 0, packet.getLength());
..............
请大家帮我解决这个问题 谢谢大家。。。 --------------------编程问答-------------------- 是在一个局域网内还是多个网络内?如果在局域网,win7内是控制面板->windows 防火墙,关了就行了.
如果不在一个局域网内,那就要找网管了. --------------------编程问答--------------------
谢谢。。。
不只是局域网。。。 就任何2个不同电脑(不同ip)上发收udp数据包。。。 xp系统的。。。 比如从把udp数据从北京电脑发到上海的一台电脑。。。
具体怎么去 办。。。 上面的是我的真实ip. --------------------编程问答-------------------- 网管? 还是网关? --------------------编程问答-------------------- TCP:
package TCP.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
//客户端口
public class TCPclient {
public static void main(String[] args){
//捕获异常
try {
Socket s = new Socket("127.0.0.1",1025);
//获取Socket的输出流,用于发送信息
OutputStream out = s.getOutputStream();
//获取Socket的输入流,用于读取信息
InputStream in1 = s.getInputStream();
myclient mc = new myclient(out);
mc.start();
while(true){
//读取以字节byte为单位的信息
byte b1[] = new byte[1024];
//读取服务器端回复的信息的长度
int len = in1.read(b1);
//把 byte数组转换成字符串,b 是byte数组,0和len是指转换的长度
String str1 = new String(b1,0,len);
//输出服务器端回复的信息
System.out.println("服务器端回复了消息:"+str1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class myclient extends Thread{
Scanner in = new Scanner(System.in);
OutputStream out = null;
public myclient(OutputStream out){
this.out=out;
}
public void run() {
try {
while(true){
System.out.println("请输入您要发给 服务器端 的信息:");
String str = in.next();
byte b[] = str.getBytes();
//读写发给对方的信息
out.write(b);
//刷新
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package TCP.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器端口
public class TCPserver {
public static void main(String[] args) {
//捕获异常
try {
//定义一个TCP的服务器端,指定程序运行在那个端口号上 该端口可自定义
ServerSocket ss = new ServerSocket(1025);
//等待客户端的请求
Socket s = ss.accept();
//获取Socket的输入流,用于读取信息
InputStream in1 = s.getInputStream();
//获取Socket的输出流,用于发送信息
OutputStream out = s.getOutputStream();
myserver ms = new myserver(out);
ms.start();
while(true){
//读取以字节byte为单位的信息
byte b[] = new byte[1024];
//读取客户端发来的信息的实际长度
int len = in1.read(b);
//把 byte数组转换成字符串,b 是 byte数组,0和len是指转换的长度
String str = new String(b,0,len);
//输出客户端发来的信息
System.out.println("客户端发来了信息:"+str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class myserver extends Thread{
Scanner in = new Scanner(System.in);
OutputStream out = null;
public myserver(OutputStream out) {
this.out=out;
}
public void run() {
try {
while(true){
System.out.println("请输入您要发给 客户端 的信息:");
String str1 = in.next();
byte b1[] = str1.getBytes();
//读写发给对方的信息
out.write(b1);
//刷新
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} --------------------编程问答-------------------- UDP:
package UDP.client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class MyUDPclient {
public static void main(String[] args) {
try {
//创建socket绑定到指定的端口
DatagramSocket socket = new DatagramSocket(2011);
sendThread s = new sendThread(socket);
s.start();
while(true){
//接受信息
byte receiveb[] = new byte[1024];
DatagramPacket receivepacket = new DatagramPacket(receiveb,receiveb.length);
socket.receive(receivepacket);
String str = new String(receiveb,0,receivepacket.getLength());
System.out.println("收到 服务器 信息:"+str);
System.out.println("请输入发给 服务器 的信息:");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class sendThread extends Thread{
DatagramSocket socket = null;
Scanner in = new Scanner(System.in);
public sendThread(DatagramSocket socket){
this.socket = socket;
}
public void run() {
try {
System.out.println("请输入发给 服务器 的信息:");
while(true){
//发送信息
String sendstr = in.next();
byte sendb[] = sendstr.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
//创建一个发送数据报,address为接收方地址,port(2012)为接收方端口
DatagramPacket sendpacket = new DatagramPacket(sendb,sendb.length,address,2012);
socket.send(sendpacket);
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
package UDP.server;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class MyUDPserver {
public static void main(String[] args) {
try {
//创建socket绑定到指定的端口
DatagramSocket socket = new DatagramSocket(2012);
sendThread s = new sendThread(socket);
s.start();
while(true){
//接受信息
byte receiveb[] = new byte[1024];
//创建接收数据报对象,能接收实际长度字节的数据放到receive位置
DatagramPacket receivepacket = new DatagramPacket(receiveb,receiveb.length);
socket.receive(receivepacket);
String str = new String(receiveb,0,receivepacket.getLength());
System.out.println("收到 客户 信息:"+str);
System.out.println("请输入发给 客户 的信息:");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class sendThread extends Thread{
DatagramSocket socket = null;
Scanner in = new Scanner(System.in);
public sendThread(DatagramSocket socket) {
this.socket = socket;
}
public void run() {
try {
while(true){
//发送信息
String sendstr = in.next();
byte sendb[] = sendstr.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
//创建一个发送数据报,address为接收方地址,port(2011)为接收方端口
DatagramPacket sendpacket = new DatagramPacket(sendb,sendb.length,address,2011);
socket.send(sendpacket);
}
}catch (Exception e) {
e.printStackTrace();
}
}
} --------------------编程问答-------------------- 可以参考下。。。 --------------------编程问答--------------------
谢谢 要用UDP hole punching(UDP打洞技术)吗?
我看看 您的代码。。。 --------------------编程问答--------------------
我的代码也本地运行 100% good...
但 从其他电脑收不到udp。。。。。是防火墙的,还是别的什么原因? 谢谢 --------------------编程问答-------------------- 怎么解决? --------------------编程问答-------------------- 都说过了,如果是局域网收不到,那就是防火墙的问题,配置方法我前面也提到了. --------------------编程问答-------------------- 标记一下,学习 --------------------编程问答-------------------- 这个真的太麻烦了 怎么解决? 谢谢大家 --------------------编程问答-------------------- 晕死 这里就没人懂吗?!!!!!!!!!!1
--------------------编程问答-------------------- 1、两台机器是在同一个局域网么,是不是能ping通,可以的话检查下防火墙之类,或者直接看两台电脑之间能不能共享数据。
2、UDP协议传输本来就是不可靠的,发送数据丢包时有发生,看lz每次收不到,应该就不是这个原因。 --------------------编程问答-------------------- mark 一下 , 这个很不错,晚上回家研究一下
补充:Java , Java EE