聊天工具在如今这个信息爆炸时代,是不可或缺的必备社交工具之一。对于初学Java套接字Socket编程者,用Java套接字Socket编程实现简单的聊天小工具,就是一个很好的练习项目。既简单,有能基本理解Java套接字的运行原理、所涉及到的类及其属性和类之间的关系。
该聊天小工具需要完成服务器端和客服端2部分功能。创建项目,其结构如下:
套接字Socket编程实现聊天项目结构
1、服务器端
1.1、编写代码
服务器端代码如下,重要代码都有注释。
package com.dhj.server;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//服务器
public class TCPServerSocket{
String file = "msg.txt";
//
public static final int PORT = 12345;// 监听的端口号
public static void main(String[] args) throws IOException {
System.out.println("服务器启动...\n");
TCPServerSocket server = new TCPServerSocket();
server.init();
}
public void init() throws IOException {
//如日志文件不存在,则创建
File f = new File(file);
if (!f.exists())
f.createNewFile();
try {
ServerSocket serverSocket = new ServerSocket(PORT);
while (true) {
// 一旦阻塞,则表示服务器与客户端获得了连接
Socket client = serverSocket.accept();
// 处理这次连接
new HandlerThread(client);
}
} catch (Exception e) {
System.out.println("服务器异常: " + e.getMessage());
}
}
private class HandlerThread implements Runnable {
private Socket socket;
public HandlerThread(Socket client) {
socket = client;
new Thread(this).start();
}
public void run() {
try {
// 读取客户端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
String clientInputStr = input.readUTF();
System.out.println("【客户端】:" + clientInputStr);
// 向客户端回复信息
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【服务器】:");
// 发送信息
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(s);
//-记录聊天信息到文本文件中---
FileOutputStream fos = new FileOutputStream(file,true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
String m = "----------------------------\r\n";
bos.write(m.getBytes());
m = "【客户端】:" + clientInputStr + "\r\n";
bos.write(m.getBytes());
m = "【服务器】:" + s + "\r\n";
bos.write(m.getBytes());
//关闭释放资源
out.close();
input.close();
bos.close();
fos.close();
} catch (Exception e) {
System.out.println("服务器异常:\n " + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
socket = null;
System.out.println("服务端运行异常:\n" + e.getMessage());
}
}
}
}
}
}
1.2、运行代码
运行服务器端代码,如下图所示:
运行服务器端代码
注意:
服务器端要先于客服端运行。
2、客服端
2.1、编写代码
客服端代码如下,重要代码都有注释。
package com.dhj.client;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
//客户端
public class TCPServerSocketClient{
public static final String IP_ADDR = "localhost";//服务器地址 127.0.0.1
public static final int PORT = 12345;//服务器端口号
public static void main(String[] args) {
System.out.println("客户端启动...");
System.out.println("当接收到服务器端字符为 'StopTalk'时, 客户端将终止。\n");
while (true) {
Socket socket = null;
try {
// 创建套接字并将其连接到指定主机上的指定端口号
socket = new Socket(IP_ADDR, PORT);
// 读取服务器端传递的数据
DataInputStream input = new DataInputStream(socket.getInputStream());
// 向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.print("【客户端】: ");
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.writeUTF(str);
String ret = input.readUTF();
System.out.println("【服务端】: " + ret);
// 收到 StopTalk时断开连接
if ("StopTalk".equalsIgnoreCase(ret)) {
System.out.println("客户端将关闭连接。");
Thread.sleep(500);
break;
}
out.close();
input.close();
} catch (Exception e) {
System.out.println("客户端异常:" + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.out.println("客户端运行异常:" + e.getMessage());
}
}
}
}
}
}
2.2、运行代码
运行客户端代码,如下图所示:
运行客户端代码
运行客服端结果如下图所示:
运行客服端结果
此时,就可以聊天了。“【客服端】:”后输入要聊天的内容,【服务端】就能看到聊天内容。
3、运行聊天小工具
“【客服端】”与“【服务端】”聊天内容如下图所示。当“【服务端】”发出“'StopTalk'”则结束聊天。
【客服端】与【服务端】聊天内容
后台保存了聊天内容,如下图所示:
保存了聊天内容的文件msg.txt
找到并打开“msg.txt”,可以看到刚才的聊天内容,如下图所示。
打开文件msg.txt