java socket 通信,简易聊天功能,
参考:http://www.cnblogs.com/feijian/p/4461087.html
服务端:
package com.lw.socket.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; public class ChatServer extends ServerSocket { private static final int SERVER_PORT = 8000; private static final String KEY = "key"; private static boolean isPrint = false;// 是否输出消息标志 private static List<String> user_list = new ArrayList<>();// 登录用户集合 private static List<ServerClientThread> thread_list = new ArrayList<ServerClientThread>();// 服务器已启用线程集合 private static LinkedList<String> message_list = new LinkedList<String>();// 存放消息队列 /** * 创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理 */ public ChatServer() throws IOException { super(SERVER_PORT);// 创建ServerSocket new PrintOutThread();// 创建向客户端发送消息线程 new ServerReadThread();// 创建向客户端发送消息线程(服务端输入数据推送到各客户端) try { while (true) {// 监听客户端请求,启个线程处理 Socket socket = accept(); new ServerClientThread(socket); } } catch (Exception e) { e.printStackTrace(); } finally { close(); } } /** * 监听是否有输出消息请求线程类,向客户端发送消息 */ class PrintOutThread extends Thread { public PrintOutThread() { start(); } @Override public void run() { while (true) { if (isPrint) {// 将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。 String message = message_list.getFirst(); for (ServerClientThread thread : thread_list) { thread.sendMessage(message); } message_list.removeFirst(); isPrint = message_list.size() > 0 ? true : false; } } } } /** * 服务器向各客户端发送数据的线程 */ class ServerReadThread extends Thread { public ServerReadThread() { start(); } @Override public void run() { BufferedReader br = null; try { while (true) { System.out.println("服务端发送数据输入:"); br = new BufferedReader(new InputStreamReader(System.in)); String send = br.readLine(); DateFormat dateTimeformat = new SimpleDateFormat("HH:mm:ss"); String date = dateTimeformat.format(new Date()); message_list.addLast(date + "【系统消息】:" + send); isPrint = true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } } /** * 服务器线程类 */ class ServerClientThread extends Thread { private Socket client; private PrintWriter writer; private BufferedReader reader; private String name; public ServerClientThread(Socket s) throws IOException { client = s; writer = new PrintWriter(client.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); String read = reader.readLine(); if(KEY.equals(read)) { writer.println("成功连上聊天室,请输入你的名字:"); start(); } } @Override public void run() { try { int flag = 0; String line = reader.readLine(); while (!"byeClient".equals(line)) { // 查看在线用户列表 if ("showuser".equals(line)) { writer.println(this.listOnlineUsers()); line = reader.readLine(); } // 第一次进入,保存名字 if (flag++ == 0) { name = line; user_list.add(name); thread_list.add(this); writer.println(name + "你好,可以开始聊天了..."); this.pushMessage("【" + name + "】进入聊天室..."); } else { this.pushMessage("【" + name + "】 say : " + line); } line = reader.readLine(); } writer.println("byeClient"); } catch (Exception e) { e.printStackTrace(); } finally {// 用户退出聊天室 try { client.close(); } catch (IOException e) { e.printStackTrace(); } thread_list.remove(this); user_list.remove(name); pushMessage("【" + name + "】退出了聊天室"); } } // 放入消息队列末尾,准备发送给客户端 private void pushMessage(String msg) { DateFormat dateTimeformat = new SimpleDateFormat("HH:mm:ss"); String date = dateTimeformat.format(new Date()); message_list.addLast(date + msg); isPrint = true; } // 向客户端发送一条消息 private void sendMessage(String msg) { writer.println(msg); } // 统计在线用户列表 private String listOnlineUsers() { String s = "--- 在线用户列表 ---\015\012"; for (int i = 0; i < user_list.size(); i++) { s += "[" + user_list.get(i) + "]\015\012"; } s += "--------------------"; return s; } } public static void main(String[] args) { try { new ChatServer().close();// 启动服务端 } catch (IOException e) { e.printStackTrace(); } } }
客户端:
package com.lw.socket.client; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ChatClient extends Socket { private static final String SERVER_IP = "127.0.0.1"; private static final int SERVER_PORT = 8000; private static final String PASSWORD = "pwd"; private static final String KEY = "key"; private Socket client; private PrintWriter writer; private BufferedReader reader; /** * 与服务器连接,并输入发送消息 */ public ChatClient() throws Exception { super(SERVER_IP, SERVER_PORT); client = this; writer = new PrintWriter(client.getOutputStream(), true); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); new readLineThread(); System.out.println("输入正确的密码连接服务器"); while(true) { BufferedReader readerIn = new BufferedReader(new InputStreamReader(System.in)); String input = readerIn.readLine(); if(PASSWORD.equals(input)) { writer.println(KEY); break; } else { System.out.println("输入错误,请重新输入!"); } } while (true) { reader = new BufferedReader(new InputStreamReader(System.in)); String input = reader.readLine(); writer.println(input); } } /** * 用于监听服务器端向客户端发送消息线程类 */ class readLineThread extends Thread { private BufferedReader buff; public readLineThread() { try { buff = new BufferedReader(new InputStreamReader(client.getInputStream())); start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { try { while (true) { String result = buff.readLine(); if ("byeClient".equals(result)) {// 客户端申请退出,服务端返回确认退出 break; } else {// 输出服务端发送消息 System.out.println(result); } } reader.close(); writer.close(); client.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { try { new ChatClient().close();// 启动客户端 } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
本文将详细解析标题为“最简单的socket通信例子”的Java Socket编程实例,帮助初学者理解如何实现客户端-服务器之间的通信。 首先,我们要明白Socket在计算机网络中的作用。Socket是网络通信的基本单元,它提供了...
Java Socket通信是网络编程中的基础概念,主要用于实现客户端与服务器之间的双向通信。在这个"JAVA Socket通信示例"中,我们可能会看到如何通过Socket类来创建连接,实现数据的单工、半双工和全双工传输。下面我们将...
Java Socket通信实现是Java网络编程中的重要组成部分,它允许两台计算机通过TCP/IP协议进行双向通信。Socket在Java中提供了低级别的、面向连接的、基于流的通信接口,是构建客户端-服务器应用程序的基础。 首先,...
让我们通过三个逐步进阶的例子来理解Java Socket通信的实现: 1. **简单回显服务器**:这个例子展示了最基本的ServerSocket和Socket的使用。服务器端创建ServerSocket并监听一个端口,当客户端连接时,服务器接收...
LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf
1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现服务端; 2.重点解决安全策略问题:将flash发布为html格式后,本地访问页面后,一般可以与服务器进行socket通信;但是部署到tomcat服务器上后无法...
例子都可以跑通均已测试通过 com.socket 包中是一个简单的客户端发给服务器的例子 com.socket.complex 使用多线程来模拟通信 com.socket.block 根据客户端传递的参数来返回不同的信息
【Java Socket通信详解】 Java作为一种强大的开发语言,其在网络编程中的应用广泛,主要体现在通过URL访问网络资源和使用Socket进行客户端/服务器通信。Socket通信基于TCP/IP协议的传输层接口,适用于需要高度定制...
Java Socket编程是Java网络编程的重要组成部分,主要用于实现客户端与服务器之间的通信。Socket基于TCP/IP协议,提供了两种不同的通信模式:TCP(传输控制协议)和UDP(用户数据报协议)。在这个小例子中,我们将...
Java Socket编程是网络编程的基础,它提供了两台计算机之间的低级别通信接口。在这个例子中,我们将探讨如何使用Java Socket进行数据的发送和接收。Socket在Java中被封装在`java.net.Socket`和`java.net....
在这个"一个简单的JAVA SOCKET的例子"中,我们可以通过分析描述和标签了解到,它是一个基于Java的简单聊天程序,包含服务端和客户端,且使用了Swing库来构建用户界面,非常适合初学者学习。 首先,让我们从基础开始...
`实例42`可能是提供了一个具体的MATLAB Socket通信的例子,可能包括客户端和服务器的MATLAB脚本,用于演示如何设置Socket连接,发送和接收数据。为了深入理解,你需要打开并分析这些示例脚本,看看它们是如何运用...
一个简单的Java Socket通信例子: - **服务器端(ServerSocketExample.java)**: ```java ServerSocket server = new ServerSocket(8080); Socket clientSocket = server.accept(); PrintWriter out = new ...
这个socket通信比较直观,比较容易看懂,实现了Java中的socket的通信问题。是Java网络编程的一个比较不错的例子!
本文将深入探讨“socket通信例子”,并结合Java技术和多线程网络通信来解析这一主题。 首先,Socket是TCP/IP协议族的一部分,它提供了一种在网络中两台计算机之间建立连接和交换数据的机制。在Java中,`java.net....
通过这个入门例子,初学者可以理解Java Socket编程的基本原理和操作步骤,为进一步的网络编程打下坚实的基础。实际开发中,还可以结合NIO(非阻塞I/O)或其他高级框架如Netty,提高网络通信的效率和灵活性。
Java Socket是Java编程...总结来说,这个Java Socket例子展示了如何在Java中创建基本的客户端-服务器通信,特别是在处理中文数据时进行了优化。通过理解Socket的工作原理,我们可以构建出稳定、高效的网络应用程序。
在Android应用开发中,Socket通信是一种常见的网络编程方式,它允许设备之间进行双向通信。本示例主要展示了如何在Android客户端实现登录和注册功能,通过Socket连接与服务器进行数据交互。下面将详细介绍这个过程...
在Java编程语言中,Socket是实现网络通信的基础组件。它提供了进程间通信(IPC)的能力,特别是在不同机器之间。在本示例中,我们将深入探讨如何使用Java Socket进行图片的传输,这对于理解网络编程和数据交换至关...