`

Java学习系列(十七)Java面向对象之开发聊天工具

 
阅读更多

TCP通信
Socket --相当于“虚拟链路两端的插座”。Socket负责完成通信。
ServerSocket --它只负责“接收”连接。它用于产生Socket。

服务器端编程
1) 创建ServerSocket 对象,该对象负责“接收”连接。
2) 如果客户端有连接,ServerSocket 对象调用accept()方法返回一个Socket。
3) 通过IO流读取对方的信息,也可向对方发送数据。

 

客户端编程
1) new Socket()来建立与远程服务器的连接。
2) 通过IO流读取对方的信息,也可向对方发送数据。

举列说明1(简单通信):

 

/**
 * @author lhy
 * @description 服务器端
 */
public class ServerTest {
	public static void main(String[] args) {
		PrintStream ps = null;
		try {
			// ServerSocket只负责“接收”连接,20000为端口号(标识该应用程序)
			ServerSocket ss = new ServerSocket(20000);
			System.out.println("服务器端等待连接...");
			// 接收连接,它会阻塞线程
			Socket socket = ss.accept();

			// ----------------------下面统一面向IO编程--------------------------//
			ps = new PrintStream(socket.getOutputStream());
			ps.println("ServerTest你好");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			ps.close();
		}
	}

}

 

/**
 * @author lhy
 * @description 客户端
 */
public class ClientTest {
	public static void main(String[] args) {
		BufferedReader br = null;
		try {
			Socket socket = new Socket("192.168.0.8", 20000);

			// ----------------------下面统一面向IO编程--------------------------//
			br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

举列说明2(控制台多人聊天):

 

服务器端:

 

public class ServerTest {
	static Set<Socket> clients = Collections
			.synchronizedSet(new HashSet<Socket>());

	public static void main(String[] args) {
		ServerSocket ss = null;
		try {
			ss = new ServerSocket(20000);
			System.out.println("服务器端等待连接...");
			while (true) {
				// 接收连接,它会阻塞线程
				Socket socket = ss.accept();
				clients.add(socket);
				// 启动线程
				new ServerThread(socket).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ss.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

// 单独封装一个线程类
class ServerThread extends Thread {
	private Socket socket;

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		BufferedReader br = null;
		try {
			while (true) {
				// ----------------------下面统一面向IO编程--------------------------//
				br = new BufferedReader(new InputStreamReader(socket
						.getInputStream()));
				String line = null;
				while ((line = br.readLine()) != null) {
					for (Socket s : ServerTest.clients) {
						PrintStream ps = new PrintStream(s.getOutputStream());
						ps.println(line);// 输出各个客户端对应的Socket
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

客户端:

 

 

public class ChatServer {
	// 定义一个线程安全的Set集合
	public static Set<Socket> clients = Collections
			.synchronizedSet(new HashSet<Socket>());

	public static void main(String[] args) throws IOException {
		// ServerSocket只负责“接受”连接,不能通信
		// 该服务器程序就在30002端口监听
		ServerSocket ss = new ServerSocket(20000);
		System.out.println("服务器等待连接...");
		while (true) { // 这样保证每个客户端有一条线程
			// 接受连接。它会阻塞线程
			Socket socket = ss.accept();// 只要连接成功,它会返回socket
			clients.add(socket);// 每次客户端连接进来,就将该客户端添加到clients集合中
			System.out.println("当前用户数量:" + clients.size());
			new ServerThread(socket).start();
		}
	}
}

class ServerThread extends Thread {
	private Socket socket;

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		// -----原來读文件,现在改为读网络,只要改节点
		try {
			BufferedReader socketBr = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			String line = null;// line代表从网络中读取数据
			while ((line = socketBr.readLine()) != null) {
				for (Iterator<Socket> it = ChatServer.clients.iterator(); it
						.hasNext();) {
					Socket s = it.next();
					try {

						PrintStream ps = new PrintStream(s.getOutputStream());
						ps.println(line);// 输出到各客户端对应的socket
					} catch (SocketException ex) {
						it.remove();// 捕获到该socket的异常,即表明Socket已经断开
                                                System.out.println("当前用户数量:" + ChatServer.clients.size());
						// ex.printStackTrace();
					}
				}
			}
		} catch (SocketException se) {
			ChatServer.clients.remove(socket);
                        System.out.println("当前用户数量:" + ChatServer.clients.size()); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

小结:

 

System.in :读取键盘输入。包装方法:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

socket.getInputStream():读取网络。包装方法:BufferedReadersocketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));

socket.getOutputStream():写入(输出到)网络。包装方法:PrintStream socketOut = new PrintStream(socket.getOutputStream());

System.out:输出到屏幕。

下面以之前IO讲的一张图来结束:

 

 

 

分享到:
评论

相关推荐

    java开发的聊天工具

    首先,Java作为一种跨平台的面向对象语言,是开发聊天工具的理想选择。其“一次编写,到处运行”的特性确保了聊天工具在不同操作系统上的兼容性。Java的标准库提供了一系列用于网络通信的类,如java.net.Socket和...

    Java聊天工具 Java聊天工具 Java聊天工具

    总的来说,这个Java聊天工具项目涵盖了Java GUI编程、网络通信、多线程、数据结构、事件处理、系统集成等多个方面的知识,对于学习和提升Java编程技能,尤其是客户端应用开发,具有很高的实践价值。

    JAVA即时聊天工具

    【JAVA即时聊天工具】是一种基于JAVA技术开发的即时通讯软件,它允许用户进行实时的文本、图片以及表情的交流,提供了基本的社交功能,如添加好友等。在深入探讨这个工具之前,我们先来理解一下JAVA语言在即时聊天...

    java聊天工具实验报告

    Java聊天工具实验报告充分体现了Java语言在实现网络通信应用中的强大能力,同时也验证了学习Java语言理论知识与实践相结合的重要性。通过本次设计,参与者不仅提升了编程技能,还增强了问题解决和团队协作的能力。

    基于java的QQ聊天工具

    JavaQQ聊天工具是一款基于Java编程语言开发的即时通讯软件,它实现了QQ的基本功能,包括私聊和群聊,是初学者学习Java网络编程和图形用户界面设计的良好实践案例。下面我们将深入探讨这款工具背后的Java技术及其相关...

    Java基础教程完整版

    Java学习系列(十七):Java面向对象之开发聊天工具 本章节主要讲解Java的网络编程,包括开发聊天工具、基于UDP协议的网络通信等。 Java学习系列(十八):Java面向对象之基于UML建模 本章节主要讲解Java的UML...

    java开发的聊天系统

    首先,Java是这个聊天系统的基石,它是一种跨平台的面向对象编程语言,具有丰富的类库和强大的功能,特别适合开发复杂的应用程序。Java的“一次编写,到处运行”特性使得聊天系统可以在多种操作系统上运行,如...

    java实现的聊天工具 简易版 非常适合学习用

    Java是一种面向对象的、跨平台的语言,它的“一次编写,到处运行”特性使得它在软件开发中广泛应用。在这个项目中,Java的主要作用是处理网络通信和用户交互,实现聊天功能。 聊天工具的核心部分是网络编程,涉及到...

    java写的聊天工具

    首先,Java是这个聊天工具的基础,它是一种跨平台的面向对象的编程语言,以其“一次编写,到处运行”的特性而闻名。Java的类库丰富,特别适合构建网络应用程序,比如聊天工具,因为其提供了用于网络通信的Socket类,...

    java编写QQ聊天工具

    - 类与对象:Java是一种面向对象的语言,QQ聊天工具的实现会涉及到大量的类和对象设计,如用户类、消息类、聊天窗口类等。 - 异常处理:在程序中,异常处理是必不可少的,例如在网络连接中断或数据传输错误时,...

    基于java开发建议聊天工具.zip

    Java是一种广泛应用于网络应用开发的面向对象编程语言,以其跨平台、安全性和高效性而闻名。在这个聊天工具项目中,Java发挥了关键作用,为服务器和客户端的通信提供了稳定的基础。 2. **Java IM系统架构**: 该...

    JAVA编写的聊天小工具

    1. **JAVA基础**:JAVA是面向对象的编程语言,具有跨平台性,通过Java虚拟机(JVM)运行。在这个聊天工具中,JAVA的基础语法、类、对象、接口等概念是构建程序的基础。 2. **网络编程**:聊天工具涉及TCP/IP协议栈...

    基于Java网络聊天工具设计研究.pdf

    Java网络聊天工具的设计研究是信息技术领域的重要课题之一,尤其在当今的信息时代,互联网技术的广泛渗透使得网络聊天工具成为人们日常生活中不可或缺的组成部分。相较于传统的面对面聊天方式,网络聊天工具具有低...

    java 版仿QQ聊天工具

    【Java版仿QQ聊天工具】是一款基于Java编程语言开发的即时通讯软件,旨在模拟QQ的基本功能,让用户在桌面环境中体验类似QQ的聊天体验。这款工具的开发使用了Eclipse集成开发环境,这是一个广泛使用的Java开发工具,...

    基于tcp-java的聊天工具

    在Java编程环境中,利用TCP协议开发聊天工具可以实现稳定且高效的通信。本篇文章将深入探讨如何使用Java实现基于TCP的聊天工具,包括其基本原理、设计模式以及关键代码实现。 1. **TCP协议基础** TCP是互联网协议...

    基于JAVA的聊天系统工具开发与设计

    本项目以JAVA为编程语言,采用C/S(客户端/服务器)架构,提供了一个简单而实用的聊天工具,对于初学者来说,是巩固JAVA基础知识的绝佳实践案例。 Java是一种广泛使用的面向对象的编程语言,以其跨平台的特性深受...

    Qzmy.rar_Qz_java 聊天_java聊天工具_聊天_聊天工具

    Java是一种面向对象的语言,它的强类型和垃圾回收机制使得它非常适合用于构建稳定且安全的网络应用。在Qzmy中,注册和登录功能通常涉及到用户账户的验证和管理,这可能需要用到数据库技术,如MySQL或Oracle,来存储...

    基于JAVA技术的QICQ聊天工具的设计与实现.rar

    《基于JAVA技术的QICQ聊天工具的设计与实现》是一篇深入探讨如何运用JAVA技术构建类似QQ即时...通过深入阅读和分析,我们可以学习到如何用JAVA技术构建一个高效、稳定的聊天工具,为今后的软件开发工作提供宝贵经验。

    JAVA版模仿腾讯QQ的局域网聊天工具

    总的来说,【JAVA版模仿腾讯QQ的局域网聊天工具】项目涵盖了JAVA编程的多个重要领域,包括GUI设计、网络通信、多线程编程以及面向对象的设计原则,对于学习和提升JAVA技能是一个很好的实践案例。通过分析和理解源码...

    java socket 即时聊天工具(含设计文档)

    在这个“java socket 即时聊天工具”项目中,我们看到它被用于构建一个简单的即时聊天应用程序,包括客户端和服务器端两部分。这样的应用允许用户通过网络进行实时的信息交换。 在Java中,Socket是基于TCP/IP协议的...

Global site tag (gtag.js) - Google Analytics