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

来源:互联网 发布:诺维斯基10年数据 编辑:程序博客网 时间:2024/05/29 13:51

转载请注明出处,谢谢: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 1