下面是关于“java学习之利用TCP实现的简单聊天示例代码”的完整攻略。
什么是TCP?
TCP,即传输控制协议,是一种在网络中传输的协议。它能够保证数据的完整性、顺序性和传输可靠性。在网络通信中,TCP是最常见、最重要的传输协议之一。
利用TCP实现的简单聊天示例代码
下面,我将提供一段使用Java编写的利用TCP实现的简单聊天示例代码,可以让你更好地理解TCP的相关知识。
代码实现
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatClient {
private Socket socket = null;
private BufferedReader console = null;
private DataOutputStream dos = null;
private DataInputStream dis = null;
private boolean flag = true;
public ChatClient() {
try {
console = new BufferedReader(new InputStreamReader(System.in));
socket = new Socket("localhost", 9999);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
System.out.print("请输入用户名: ");
String name = console.readLine();
send(name);
System.out.println("连接成功,可以开始聊天!");
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("服务器连接异常。");
}
}
private void send(String message) {
try {
dos.writeUTF(message);
dos.flush();
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("发送信息异常。");
}
}
private void receive() {
try {
String message = dis.readUTF();
System.out.println(message);
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("接受信息异常。");
}
}
public void start() {
while (flag) {
try {
String message = console.readLine();
send(message);
if (message.equals("bye")) {
flag = false;
}
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("发送信息异常。");
}
receive();
}
}
private void closeAll() {
try {
if (console != null) console.close();
if (dos != null) dos.close();
if (dis != null) dis.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatClient client = new ChatClient();
client.start();
}
}
代码说明
通过上述Java代码,你可以创建一个用于简单聊天的客户端,该客户端基于TCP协议实现,支持输入用户名进行连接,和发送消息获取服务器响应聊天,具体功能如下:
- 在连接服务器时,需要输入用户名,用于进行身份验证。
- 发送消息后,会等待服务器响应后再显示聊天内容。
- 输入bye可退出。
示例一
首先,在命令提示符(cmd)下,进入服务器端的所在文件目录,并输入以下命令启动服务器端:
>java ChatServer
此时,服务端会监听端口9999,并处于等待状态。接下来,在另一个命令提示符中,进入客户端所在目录,并输入以下命令启动客户端:
>java ChatClient
客户端向服务器发送连接请求,并提示用户输入用户名,用户输入用户名后,即可进行聊天。
示例二
接下来,我们可以通过改写程序代码实现多人聊天室功能。
首先,将ChatClient改为MultiChatClient,并创建一个客户端列表:
import java.net.*;
import java.io.*;
import java.util.*;
public class MultiChatClient {
private Socket socket = null;
private BufferedReader console = null;
private DataOutputStream dos = null;
private DataInputStream dis = null;
private boolean flag = true;
private List<Client> clients = new ArrayList<Client>();
public MultiChatClient() {
try {
console = new BufferedReader(new InputStreamReader(System.in));
socket = new Socket("localhost", 9999);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
System.out.print("请输入用户名: ");
String name = console.readLine();
send(name);
System.out.println("连接成功,可以开始聊天!");
new Thread(new Receive()).start();
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("服务器连接异常。");
}
}
public void start() {
while (flag) {
try {
String message = console.readLine();
send(message);
if (message.equals("bye")) {
flag = false;
}
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("发送信息异常。");
}
}
}
public void send(String message) {
try {
dos.writeUTF(message);
dos.flush();
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("发送信息异常。");
}
}
private void closeAll() {
try {
if (console != null) console.close();
if (dos != null) dos.close();
if (dis != null) dis.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MultiChatClient client = new MultiChatClient();
client.start();
}
class Receive implements Runnable {
public void run() {
try {
while (flag) {
String message = dis.readUTF();
System.out.println(message);
}
} catch (IOException e) {
flag = false;
closeAll();
System.out.println("接收信息异常。");
}
}
}
class Client {
private String name;
private DataOutputStream dos;
public Client(String name, DataOutputStream dos) {
this.name = name;
this.dos = dos;
}
public String getName() {
return name;
}
public DataOutputStream getDos() {
return dos;
}
}
}
然后,更新ChatServer程序,以便监听多个客户端,并为每个客户端分配一个对应的线程:
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer {
private boolean flag = true;
private ServerSocket server = null;
// 客户端对象列表
private List<Client> clients = new ArrayList<Client>();
public ChatServer() {
try {
server = new ServerSocket(9999);
System.out.println("服务器启动成功。");
} catch (IOException e) {
flag = false;
System.out.println("服务器启动异常。");
}
}
// 运行服务器程序
public void start() {
while (flag) {
try {
Socket socket = server.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
String name = dis.readUTF();
// 将新客户端加入客户端对象列表中
Client client = new Client(name,socket);
clients.add(client);
System.out.println("新客户端[" + name + "]连接成功。");
// 为新客户端分配线程,用于接收信息
new Thread(new Receive(client)).start();
send("新客户端[" + name + "]加入聊天室。",client);
} catch (IOException e) {
flag = false;
System.out.println("接收信息异常。");
}
}
}
// 关闭服务器程序
public void close() {
try {
if (server != null) {
server.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 广播消息
private void send(String message) {
for (int i = 0; i < clients.size(); i++) {
Client c = clients.get(i);
try {
DataOutputStream dos = c.getDos();
dos.writeUTF(message);
dos.flush();
} catch (IOException e) {
flag = false;
System.out.println("发送信息异常。");
clients.remove(c);
i--;
}
}
}
// 向指定客户端发送消息
private void send(String message, Client client) {
try {
DataOutputStream dos = client.getDos();
dos.writeUTF(message);
dos.flush();
} catch (IOException e) {
flag = false;
System.out.println("发送信息异常。");
}
}
class Receive implements Runnable {
private Client client;
public Receive(Client client) {
this.client = client;
}
public void run() {
try {
DataInputStream dis = new DataInputStream(client.getSocket().getInputStream());
while (flag) {
String message = dis.readUTF();
System.out.println(client.getName() + ": " + message);
send(client.getName() + ": " + message,client);
if (message.equals("bye")) {
flag = false;
}
}
dis.close();
if (client != null) {
clients.remove(client);
System.out.println("[Client " + client.getName() + "]已断开连接。");
send("[Client " + client.getName() + "]已退出聊天室。");
}
} catch (IOException e) {
flag = false;
clients.remove(client);
System.out.println("接收消息异常。");
send("[Client " + client.getName() + "]已退出聊天室。");
}
}
}
class Client {
private String name;
private Socket socket;
private DataOutputStream dos;
public Client(String name, Socket socket) {
this.name = name;
this.socket = socket;
try {
dos = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public String getName() {
return name;
}
public Socket getSocket() {
return socket;
}
public DataOutputStream getDos() {
return dos;
}
}
public static void main(String[] args) {
ChatServer server = new ChatServer();
server.start();
}
}
这样,我们就可以通过一定的改写,将上述简单聊天示例代码改为多人聊天室,实现了多人聊天。
以上就是本篇的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java学习之利用TCP实现的简单聊天示例代码 - Python技术站