【Java开源代码栏目提醒】:网学会员,鉴于大家对Java开源代码十分关注,论文会员在此为大家搜集整理了“ChatDemo.java”一文,供大家参考学习!
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatDemo {
// 存储端口号
static int port;
// 将IP地址存储在字节数组中
static byte[] IPAddr = new byte[4];
// IP地址的字符串形式
static String IP;
// 存储消息的字节数组
static byte[] buf = new byte[1000];
// 接收消息的数据包
static DatagramPacket rec = new DatagramPacket(buf, buf.length);
// 发送消息的数据包
static DatagramPacket snd;
// 主方法
public static void main(String[] args) {
// 根据参数不同决定调用服务器方法或客户端方法
if (args[0].compareTo("-s") == 0) {
IP = args[1];
// 将字符串形式的IP地址存入字节数组中
toIPAddr();
port = (int)Float.parseFloat(args[2]);
// 调用服务器方法
server();
}
else if (args[0].compareTo("-c") == 0) {
IP = args[1];
// 将字符串形式的IP地址存入字节数组中
toIPAddr();
port = (int)Float.parseFloat(args[2]);
// 调用客户端方法
client();
}
else {
System.out.println("参数错误!");
}
}
// 服务器方法
static void server() {
// 存放收到的消息
String inMsg = "";
// 存放要发送的消息
String outMsg = "";
System.out.println("聊天程序开始运行……");
try {
// 实例化数据报
DatagramSocket serverSK = new DatagramSocket(port);
// 接收消息
serverSK.receive(rec);
// 将消息从数据包中取出转化为字符串
inMsg = new String(rec.getData(), 0, rec.getLength());
// 如果收到的是“quit”指令,则终止程序
while (inMsg.compareTo("quit") != 0) {
// 输出收到的消息
System.out.println(rec.getAddress() + ":" + inMsg);
// 读取输入
BufferedReader bufRdr = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入:");
try {
outMsg = bufRdr.readLine();
} catch(IOException ie) {
ie.printStackTrace();
}
// 将要发送的数据打包
byte[] buf = outMsg.getBytes();
snd = new DatagramPacket(buf, buf.length, rec.getAddress(), rec.getPort());
// 将数据包发出
serverSK.send(snd);
// 如果发出的是“quit”指令,则终止程序
if (outMsg.compareTo("quit") == 0) {
break;
}
// 等待客户端的消息
serverSK.receive(rec);
inMsg = new String(rec.getData(), 0, rec.getLength());
}
System.out.println("聊天结束!");
// 关闭套接字
serverSK.close();
} catch(SocketException se) {
se.printStackTrace();
} catch(IOException ie) {
ie.printStackTrace();
}
}
// 客户端方法
static void client() {
// 存放收到的消息
String inMsg = "";
// 存放要发送的消息
String outMsg = "";
// 存放目的主机的IP地址
InetAddress addr;
System.out.println("聊天
程序开始运行……");
try {
// 获得目的主机的IP地址
addr = InetAddress.getByAddress(IPAddr);
// 实例化数据报
DatagramSocket clientSK = new DatagramSocket(port);
// 读取输入
BufferedReader bufRdr = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入:");
outMsg = bufRdr.readLine();
} catch(IOException ie) {
ie.printStackTrace();
}
while (true) {
// 将要发送的数据打包
byte[] buf = outMsg.getBytes();
snd = new DatagramPacket(buf, buf.length, addr, port);
// 将数据包发出
clientSK.send(snd);
// 如果发出的是“quit”指令,则终止程序
if (outMsg.compareTo("quit") == 0) {
break;
}
// 等待客户端的消息
clientSK.receive(rec);
inMsg = new String(rec.getData(), 0, rec.getLength());
// 如果接收的是“quit”指令,则终止程序
if (inMsg.compareTo("quit") == 0) {
break;
}
// 输出收到的消息
System.out.println("\\" + IP + ": "+ inMsg);
// 继续读取输入
try {
System.out.print("请输入:");
outMsg = bufRdr.readLine();
} catch(IOException ie) {
ie.printStackTrace();
}
}
System.out.println("聊天结束!");
// 关闭套接字
clientSK.close();
} catch(SocketException se) {
se.printStackTrace();
} catch(IOException ie) {
ie.printStackTrace();
}
}
// 将字符串形式的IP地址转换为字节数组形式
public static void toIPAddr() {
int i, j, t, q;
char ch;
t = 0;
q = 1;
j = 3;
i = IP.length() - 1;
do {
ch = IP.charAt(i);
// 遇到"."符号说明已经获得了IP地址中某一段的值
if (ch == '.') {
IPAddr[j] = (byte)t;
j--;
t= 0;
q = 1;
}
// 否则继续累加
else {
t = t + (int)(ch - 48) * q;
q = q * 10;
}
i--;
} while (i >= 0);
IPAddr[j] = (byte)t;
}
}