UDP传输:简易聊天室的搭建。。。

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/45665309

最近看了一个教学视频,学习socket编程,里面有一个例子感觉写的不错,我就在此整理一下,帮助我回忆,查看。


编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。


因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。


效果如图所示:


因为我这边只有我一个电脑,所以只能我自己的这个192.168.1.48在发送数据咯~~~望见谅。。。

关于dos窗口,运行java,你可以看这个文章http://blog.csdn.net/harryweasley/article/details/45559129

/*
编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。

因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。

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

/*
 定义一个udp发送端。
 思路:
 1,建立updsocket服务。
 2,提供数据,并将数据封装到数据包中。
 3,通过socket服务的发送功能,将数据包发出去。
 4,关闭资源。

 */
class Send implements Runnable {
	private DatagramSocket ds;

	public Send(DatagramSocket ds) {
		this.ds = ds;
	}

	public void run() {
		try {
			BufferedReader bufr = new BufferedReader(new InputStreamReader(
					System.in));

			String line = null;

			while ((line = bufr.readLine()) != null) {

				byte[] buf = line.getBytes();
				// 确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length,
				// InetAddress address, int port)
				DatagramPacket dp = new DatagramPacket(buf, buf.length,
						InetAddress.getByName("192.168.1.255"), 10002);
				// 通过socket服务,将已有的数据包发送出去。通过send方法。
				ds.send(dp);

				if ("886".equals(line))
					break;
			}
		} catch (Exception e) {
			throw new RuntimeException("发送端失败");
		}
	}
}

/*
 * 
 * 定义udp的接收端。 
 * 思路: 1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
 * 方便于明确哪些数据过来该应用程序可以处理。
 * 
 * 2,定义一个数据包,因为要存储接收到的字节数据。 因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
 * 3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。 4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
 * 5,关闭资源。
 */
class Rece implements Runnable {

	private DatagramSocket ds;

	public Rece(DatagramSocket ds) {
		this.ds = ds;
	}

	public void run() {
		try {
			while (true) {
				// 定义数据包。用于存储数据。
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				// 通过服务的receive方法将收到数据存入数据包中。阻塞式方法
				ds.receive(dp);

				// 通过数据包的方法获取其中的数据。
				String ip = dp.getAddress().getHostAddress();

				String data = new String(dp.getData(), 0, dp.getLength());

				if ("886".equals(data)) {
					System.out.println(ip + "....离开聊天室");
					break;
				}

				System.out.println(ip + ":" + data);
			}
		} catch (Exception e) {
			throw new RuntimeException("接收端失败");
		}
	}
}

class ChatDemo {
	public static void main(String[] args) throws Exception {
		DatagramSocket sendSocket = new DatagramSocket();
		// 创建udp socket,建立端点。
		DatagramSocket receSocket = new DatagramSocket(10002);

		new Thread(new Send(sendSocket)).start();
		new Thread(new Rece(receSocket)).start();

	}
}

注意:InetAddress.getByName("192.168.1.255")这个意思是接收整个局域网的信息,是个广播地址。

关于TCP的传输,你可以查看这篇文章 TCP传输:利用socket服务做一个文本转换器

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值