java socket 工具_Java套接字Socket编程如何实现聊天小工具

聊天工具在如今这个信息爆炸时代,是不可或缺的必备社交工具之一。对于初学Java套接字Socket编程者,用Java套接字Socket编程实现简单的聊天小工具,就是一个很好的练习项目。既简单,有能基本理解Java套接字的运行原理、所涉及到的类及其属性和类之间的关系。

该聊天小工具需要完成服务器端和客服端2部分功能。创建项目,其结构如下:

2aa2809c8d59e5926666335fd591a1c8.png套接字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、运行代码

运行服务器端代码,如下图所示:

a37d23cf07bac46fac8e81e38ad28e60.png运行服务器端代码

注意:

服务器端要先于客服端运行。

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、运行代码

运行客户端代码,如下图所示:

53f88bda268fd9f399c8936de2f947dc.png运行客户端代码

运行客服端结果如下图所示:

f713bb9c721fcade88bbf841a5e7bd6b.png运行客服端结果

此时,就可以聊天了。“【客服端】:”后输入要聊天的内容,【服务端】就能看到聊天内容。

3、运行聊天小工具

“【客服端】”与“【服务端】”聊天内容如下图所示。当“【服务端】”发出“'StopTalk'”则结束聊天。

2747007a58da7751e3ec5dee750977b8.png【客服端】与【服务端】聊天内容

后台保存了聊天内容,如下图所示:

15c92b561ceb3fd29eff60c7d1498e20.png保存了聊天内容的文件msg.txt

找到并打开“msg.txt”,可以看到刚才的聊天内容,如下图所示。

95f19c690da9fe103e88a4df21efd677.png打开文件msg.txt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值