龙空技术网

Java套接字Socket编程如何实现聊天小工具

iT例史 787

前言:

而今大家对“套接字socket编程”大致比较看重,大家都想要学习一些“套接字socket编程”的相关内容。那么小编在网络上汇集了一些有关“套接字socket编程””的相关内容,希望小伙伴们能喜欢,同学们快快来了解一下吧!

#头条公开课繁星计划#

#Java#

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

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

Java套接字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文件中的聊天内容


标签: #套接字socket编程