程序介绍:
实现简单的聊天室的功能,代码呢我只写了一方面的(即客户端发往服务端的)其实只写一端的代码就足够了
那么怎么才能实现聊天实的功能呢,就是要再将代码复制一份,两个人在两台PC上运行代码即可。
那么运行的时候需要修改什么呢,就是要需要修改一下IP地址和端口号。
Ip地址和端口号遵循这个员原则:客户端(发送端)设置的端口号要和服务端(接收端)的端口号相对应。
这样才能保证通信的畅通。(还不明白的在去看下面的main函数,再不明白的加我QQ私聊我)
结构体系:
大体思路:
客户端:将数据打包,然后附上接收方的IP地址,然后将数据发送出去。
服务端:接收数据,然后将数据拆包,进行数据包的解析。
用到的类和方法:
InetAddress类;
获取IP地址
将IP地址以字符串的形式表示出来
此方法中的参数可以为Ip地址额字符串形式。
DatagramSocket类;
DatagramPacket类;
获得发送数据的长度
获得发送数据的内容
下面两个类是用来读数据的
字节流的形式读取,然后用高效字节流缓冲区来高效读取
BufferedRead类;
InputStreamReader类;
服务端的代码:
package com.klj.chatroomS;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ChatRoomServer implements Runnable {
/**
* 聊天室的服务端 1、创建套接字对象,指定服务端口 2、接收客户端发送过来的数据包 3、对数据包进行解析 4、关闭服务
*/
private int port;
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
@Override
public void run() {
DatagramSocket ds = null;
try {
/**
* 接收数据包
*/
// 创建套接字对象,必须指定端口,接口一般大于8000
ds = new DatagramSocket(port);
byte[] bytes = new byte[1024];
// 创建数据包,用来装数据
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
System.out.println("====服务端已启动,等待接收数据====");
while(true) {
// 接收数据包
ds.receive(dp);
/**
* 解析数据包
*/
// 获取到数据包的IP地址
InetAddress iadd = dp.getAddress();
// 获取到数据包中的数据
byte[] bytes1 = dp.getData();
// 获得到接收数据的长度
int length = dp.getLength();
// 重新组装接收到的数据,即:将字节转换成字符串
String data = new String(bytes1, 0, length);
if ("exit".equals(data)) {
System.out.println("数据发送完毕");
}
// 输出数据
System.out.println("服务端" + iadd.getHostAddress() + "接收了:" + data);
System.out.println("请再次输入您要发送的数据:");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭套接字,释放资源。
if (ds != null) {
ds.close();
}
}
}
}
客户端的代码:
package com.klj.chatroomS;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ChatRoomClient implements Runnable {
//声明ip地址和端口。
private String ip;
private int port;
//设置set和get方法
int getPort() {
return port;
}
void setPort(int port) {
this.port = port;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
@Override
public void run() {
/**
* 客户端的代码 1、将数据进行封装,并附上IP地址 2、发送数据 3、关闭服务
*/
BufferedReader br = null;
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
System.out.println("请输入您要发送的数据:");
/**
* 打包数据
*/
while (true) {
br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
// 定义数据包中要发送的的内容
byte[] bytes = str.getBytes();
int length = bytes.length;
// 创建要发送的目的地的IP
InetAddress address = InetAddress.getByName(ip);
// 打包数据
DatagramPacket dp = new DatagramPacket(bytes, length, address, port);
// 发送数据
ds.send(dp);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
main函数:
package com.klj.chatroomS;
public class Run {
public static void main(String[] args) {
//创建服务端对象
ChatRoomServer chatroomserver = new ChatRoomServer();
chatroomserver.setPort(12234);
//创建客户端对象
ChatRoomClient chatroomclient = new ChatRoomClient();
chatroomclient.setIp("192.168.43.163");
chatroomclient.setPort(12233);
//创建线程
Thread serverThread =new Thread(chatroomserver);
Thread cilentThread =new Thread(chatroomclient);
//启动线程
serverThread.start();
cilentThread.start();
}
}
package com.klj.chatroomXS;
public class Run {
public static void main(String[] args) {
// 创建服务端对象
ChatRoomServer chatroomserver = new ChatRoomServer();
chatroomserver.setPort(12233);
// 创建客户端对象
ChatRoomClient chatroomclient = new ChatRoomClient();
chatroomclient.setIp("192.168.43.163");
chatroomclient.setPort(12234);
// 创建线程
Thread serverThread = new Thread(chatroomserver);
Thread cilentThread = new Thread(chatroomclient);
// 启动线程
serverThread.start();
cilentThread.start();
}
}
最后附上的我的QQ:3030363140(有三个验证问题,第一个问题输上你的名字,其余的可以随便写),欢迎大家骚扰哦。