黑马程序员技术交流社区
标题:
UDP的问题
[打印本页]
作者:
王雷1
时间:
2013-11-24 15:40
标题:
UDP的问题
//我这么写是因为都是在127.0.0.1这一台机器上所以出现了冲突所以无法运行的还是为什么?
//还是根本就不能这么写?我是想实现一下dos的聊天,用一台电脑能实现么?如果ok应该是什么样的?用UDP的
import java.net.*;
import java.io.*;
class er
{
public static void main(String[] args)throws Exception
{
jieshou();
fasong();
}
public static void jieshou()throws Exception
{
DatagramSocket ds=new DatagramSocket(10001);
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
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+"::::"+data+":::::"+port);
}
}
public static void fasong()throws Exception
{
DatagramSocket ds=new DatagramSocket();
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))
break;
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10002);
ds.send(dp);
}
}
}
class yi
{
public static void main(String[] args)throws Exception
{
jieshou();
fasong();
}
public static void jieshou()throws Exception
{
DatagramSocket ds=new DatagramSocket(10002);
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
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+"::::"+data+":::::"+port);
}
}
public static void fasong()throws Exception
{
DatagramSocket ds=new DatagramSocket();
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))
break;
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10001);
ds.send(dp);
}
}
}
作者:
潘际昌
时间:
2013-11-24 16:28
可以实现一台电脑在DOS控制台进行聊天的,你没看毕老师的视频吗?你要把客户端和服务端分成成两个独立的主函数写,不能放在一个主函数内。然后开启2个DOS控制台,一个运行客户端,一个运行服务端。
作者:
陪你等日出
时间:
2013-11-26 00:28
你在一台电脑上实现一个同时拥有发送和接收功能的UDP聊天应该会发生java.net.BindException 异常吧,你那Address冲突了。而且如果要像你这样写,也就是同时实现发送和接收功能的UDP聊天DOS版程序应该把接收功能和发送功能分别封装成一个实现Runnable接口的类,然后在主函数里面开启两个线程分别负责发送和接收功能,但是这也是和别的电脑实现类似QQ那样的聊天,一台电脑的话还是会出现冲突。非要在一台电脑上运行的话,那就写两个程序,一个实现发送,另一个实现接收,然后开启两个DOS窗口,然后你懂得,不过这太挫了....
要么你就用TCP,像楼上说的,开启两个DOS窗口,一个运行服务端,一个运行客户端。
好吧,这是我的理解
作者:
职业规划-苏小粉老师
时间:
2013-11-26 09:36
学习。。。
作者:
RuntimeError!
时间:
2013-11-26 09:46
好好看看 学习学习。。。。~
作者:
王贺
时间:
2013-11-26 09:50
上段源码吧,两个类,一个发送,一个接收
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
try {
while((line=br.readLine())!=null)
{
if(line.equals("886"))
{
break;
}
else
{
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10009);
ds.send(dp);
}
}
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Rec implements Runnable
{
private DatagramSocket ds;
public Rec(DatagramSocket ds)
{
this.ds=ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
{
while(true)
{
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
String ip=dp.getAddress().getHostName();
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
感觉这么写比较好,希望对楼主有用
作者:
freehiker
时间:
2013-11-26 10:17
发送和接收需要定义两个类并实现Runnable接口,然后通过主函数运行两个线程开启接收和发送方,然后这个java文件复制一下,更改一下发送地址、端口和接收方的监听地址就OK了。我举个例子吧:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpOne {
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
//DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10002);
new Thread(new Send(receive)).start();
new Thread(new Receive(receive)).start();
}
catch (SocketException se)
{
throw new RuntimeException("建立数据包套接字失败");
}
}
}
//TODO Send
class Send implements Runnable
{
private DatagramSocket ds;
Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line=bfr.readLine())!=null)
{
if(line.equals("over"))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getByName("192.168.2.105"),10001);
ds.send(dp);
//System.out.println(line.toUpperCase());
}
bfr.close();
ds.close();
}
catch (IOException e)
{
throw new RuntimeException("发送失败");
}
}
}
//TODO RECEIVE
class Receive implements Runnable
{
private DatagramSocket ds;
Receive(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while(true)
{
//System.out.println("jieshou");
byte[] buf = new byte[1024*64];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"-"+port+"土豆:"+data);
}
}
catch(IOException e)
{
throw new RuntimeException("接收失败");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2