转载请注明出处,谢谢: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服务做一个文本转换器