转载请注明出处,谢谢: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(); } }
原文地址:http://blog.csdn.net/harryweasley/article/details/45665309