简单的UDP聊天,MyEclipse开发.

武星华 发布于 2011/06/21 08:54
阅读 700
收藏 0

开发工具是MYECLIPSE.

这个样子..运行udp_chat这个类..会可以输入东西,却不知道在哪儿看. 如果开2个Eclipse,运行一个,再运行另一个会爆空指针异常.

求高手解答.谢谢!在线等...真实头像已上传

代码如下:

package test;

import java.io.Serializable;

public class Message implements Serializable {

	private String msg;

	private String id;

	private String destid;

	public Message(String msg, String id, String destid) {
		this.msg = msg;
		this.id = id;
		this.destid = destid;
	}

	// 获得消息内容
	public String getMessage() {
		return msg;
	}

	// 获得发送方的ip
	public String getID() {
		return id;
	}

	// 获得接受方的ip
	public String getDestID() {
		return destid;
	}
}

package test;

//接受方
import java.net.*;
import java.io.*;

public class Receiver extends Thread {

 private Message msg;

 private DatagramPacket packet;

 private DatagramSocket socket;

 private byte[] recVBuf = new byte[500];

 public Receiver() {
  try {
   // 创建udp包以接受数据。
   packet = new DatagramPacket(recVBuf, recVBuf.length);

   // 创建接受方的udp端口以接收数据
   socket = new DatagramSocket(7002);
  } catch (Exception e) {
  }
 }

 public void run() {
  try {
   while (true) {
    // 接受数据
    socket.receive(packet);

    ByteArrayInputStream byteStream = new ByteArrayInputStream(
      recVBuf);
    ObjectInputStream is = new ObjectInputStream(
      new BufferedInputStream(byteStream));
    Object o = is.readObject();
    msg = (Message) o;
    is.close();

    System.out.println(msg.getMessage());
   }
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }
}

package test;

import java.net.*;
import java.io.*;

public class Sender extends Thread {

 private Message msg;

 private DatagramSocket socket;

 private DatagramPacket packet;

 public Sender(Message msg) {
  try {
   this.msg = msg;
   // 获得目的方的ip地址
   String destID = msg.getDestID();

   // 获得将要发送的消息内容
   // String destID = msg.getDestID;
   String message = msg.getMessage();

   ByteArrayOutputStream byteStream = new ByteArrayOutputStream(500);
   ObjectOutputStream os = new ObjectOutputStream(
     new BufferedOutputStream(byteStream));
   os.writeObject(msg);
   os.flush();
   byte[] sendBuf = byteStream.toByteArray();

   // 创建udp数据包以发送数据
   packet = new DatagramPacket(sendBuf, sendBuf.length, InetAddress
     .getByName(destID), 7002);
   // 创建发送udp套接字,指定套接字口。
   socket = new DatagramSocket(7000);
   os.close();
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }

 public void run() {
  try {
   // 发送消息
   socket.send(packet);
   // 发送完毕关闭套接字。
   socket.close();
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }
}

package test;

//测试程序

import java.io.*;
import java.net.*;

public class Udp_Chat {

 public Udp_Chat(String s) {
 }

 public static void main(String args[]) throws Exception {
  Message a = new Message("阿飞的卡", "127.0.0.1", "127.0.0.1");
  new Sender(a).start();
  new Receiver().start();
 }
}

 

以下是问题补充:

@小编辑:小编我踩了此问题,排版实在是糟糕 (2011/06/21 09:12)
加载中
0
麦麸子lee
麦麸子lee
想聊天,你得单独抽取出个service类,让它来完成所有的转发,至于每个客户端类,接收消息可以是个参数设置下,不要和已经被占用等待的重复。我记得你是可以告诉服务类你当前这个客户类接收消息的IP和端口的
0
麦麸子lee
麦麸子lee
都贴代码了,再把爆的异常贴出来
0
武星华
武星华
java.lang.NullPointerException
 at test.Receiver.run(Receiver.java:32)  这样子 空指针..
0
武星华
武星华

主要是不怎么会运行...谁能教教我,谢谢.

0
麦麸子lee
麦麸子lee
端口都被占了吧...
0
武星华
武星华
能给具体讲讲么...或者说ECLIPSE中怎么运行2个控制台
0
麦麸子lee
麦麸子lee

主要代码问题应该就是你再运行第二个的时候又运行了

new Receiver().start();这个方法,但是在同一机子上,你的

  // 创建接受方的udp端口以接收数据
057     socket =  new  DatagramSocket( 7002 ); 正被前面个程序占用呢,你再创建第二个socket肯定就不能创建成功,如果你真是要做个简单聊天工具,那你思路要还一下
0
武星华
武星华
那我应该怎么改一下呢? 再创建一个 udp_chat1类, 不调用new Receiver().start(); 这个方法可以么... 我就想实现简单的UDP聊天, 才入门网络编程, 懂的不是很多.
0
武星华
武星华
谢谢了...虽然我还是不会.我是新手.头一次接触网络编程.并且完全是自学...
返回顶部
顶部