这是一个简单的UDP通信,其中有一个小知识非常需要注意,因为我已经和一个秀儿(^_−)☆进行了远程通信,最后失败了,得了一个花费几个小时的教训,此聊天程序只可用于局域网。若发现下面的代码可以优化的地方望指出,谢谢啦|ू・ω・` )
/*需求:用两台电脑根据IP地址可以在dos命令行中进行简单的聊天程序
-
思路:
-
一、发送端:
-
1、建立udp socket服务
-
2、提供数据,因为我们要键盘录入,那键盘录入就要用到IO流啦,还要用到服务器的堵塞式方法,将数据封装到数据包中
-
3、通过socket服务的发送功能,将数据包发出去
-
二、接收端:
-
1、同样建立udp socket服务
-
2、定义一个数据包,用于存储接收的字节数据
-
3、通过socket服务把接收的数据存入数据包中
-
4、将数据包中的数据取出到控制台上
-
聊天程序!??是一个可以发送、接收的程序,说明是一个同时进行发送端、接收端的程序,那么必然要用到多线程。
-
步骤:
-
1、通过DatagramSocket对象,创建udp服务
-
2、通过DatagramPacket(byte[] buf, int length, InetAddress address, int port)方法,确定数据,并封装成数据包
-
3、通过socket服务,将数据包发送出来,用send方法。
-
4、通过receive方法将收到的数据存入数据包中,然后通过数据包的方法获取其中的数据
*/
下面是要用到的方法详细说明:static InetAddress getByName(String host) 在给定主机的情况下确定主机的IP地址 String getHostAddress() 返回InetAddress实例对应的IP地址字符串 public DatagramPacket(byte[] buf, int length) 构造DatagramPacket,用来接收长度为length的数据包 public DatagramPacket(byte[] buf, int length, InetAddress address,int port) 构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号 InteAddress getAddress() 返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收的 byte[] getData() 返回数据缓冲区 int getLength() 返回将要发送或接收到的数据长度 void receive(DatagramPacket p) 从此套接字接收数据报包 void send(DatagramPacket p) 从此套接字发送数据报包
下面便是以上方法的运用:
import java.io.*;
import java.net.*;
class Sender implements Runnable{
private DatagramSocket ds;
public Sender(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
try {
//通过DatagramPacket(byte[] buf, int length, InetAddress address, int port)方法,确定数据,并封装成数据包
BufferedReader bfrd = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bfrd.readLine()) != null) {
if("bye".equals(line)) {
System.out.println("聊天结束!");
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf, buf.length,InetAddress.getByName("对方电脑的IP地址"),端口);
//通过socket服务,将数据包发送出来,用send方法。
ds.send(dp);
}
}catch(Exception e) {
throw new RuntimeException("发送端错误!");
}
}
}
class Receiver implements Runnable {
private DatagramSocket ds;
public Receiver(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());
System.out.println(ip + ":" + data);
}
}catch(Exception e) {
throw new RuntimeException("接收端错误!");
}
}
}
public class Liaotian {
public static void main(String[] args) throws Exception{
//通过DatagramSocket对象,创建udp服务
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(端口);
new Thread(new Sender(sendSocket)).start();
new Thread(new Receiver(receSocket)).start();
System.out.println("聊天开始了喔:");
}
}
运行的成果如下:
端口写一个数字,建议0~1024之间的值不要使用,不过两台电脑的端口数字要相同,而且需要注意的是:每一次的编译和运行,端口只能编译一次,如果第二次编译那么在运行的时候会报错,因为原来的端口已经被占用了。
这一次的记录就到这里啦(σ゚∀゚)σ…:*☆哎哟不错哦。