`

java socket通信例子

阅读更多

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通信例子

    本文将详细解析标题为“最简单的socket通信例子”的Java Socket编程实例,帮助初学者理解如何实现客户端-服务器之间的通信。 首先,我们要明白Socket在计算机网络中的作用。Socket是网络通信的基本单元,它提供了...

    JAVA Socket通信示例

    Java Socket通信是网络编程中的基础概念,主要用于实现客户端与服务器之间的双向通信。在这个"JAVA Socket通信示例"中,我们可能会看到如何通过Socket类来创建连接,实现数据的单工、半双工和全双工传输。下面我们将...

    java Socket通信实现

    Java Socket通信实现是Java网络编程中的重要组成部分,它允许两台计算机通过TCP/IP协议进行双向通信。Socket在Java中提供了低级别的、面向连接的、基于流的通信接口,是构建客户端-服务器应用程序的基础。 首先,...

    java socket通讯程序源码

    让我们通过三个逐步进阶的例子来理解Java Socket通信的实现: 1. **简单回显服务器**:这个例子展示了最基本的ServerSocket和Socket的使用。服务器端创建ServerSocket并监听一个端口,当客户端连接时,服务器接收...

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    flex+java+tomcat实现socket通信及安全策略

    1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现服务端; 2.重点解决安全策略问题:将flash发布为html格式后,本地访问页面后,一般可以与服务器进行socket通信;但是部署到tomcat服务器上后无法...

    三个 java socket服务器客户端通信例子

    例子都可以跑通均已测试通过 com.socket 包中是一个简单的客户端发给服务器的例子 com.socket.complex 使用多线程来模拟通信 com.socket.block 根据客户端传递的参数来返回不同的信息

    Java Socket通信资料.doc

    【Java Socket通信详解】 Java作为一种强大的开发语言,其在网络编程中的应用广泛,主要体现在通过URL访问网络资源和使用Socket进行客户端/服务器通信。Socket通信基于TCP/IP协议的传输层接口,适用于需要高度定制...

    java socket小例子

    Java Socket编程是Java网络编程的重要组成部分,主要用于实现客户端与服务器之间的通信。Socket基于TCP/IP协议,提供了两种不同的通信模式:TCP(传输控制协议)和UDP(用户数据报协议)。在这个小例子中,我们将...

    Java Socket发送和接收的例子

    Java Socket编程是网络编程的基础,它提供了两台计算机之间的低级别通信接口。在这个例子中,我们将探讨如何使用Java Socket进行数据的发送和接收。Socket在Java中被封装在`java.net.Socket`和`java.net....

    matlab环境下socket通信

    `实例42`可能是提供了一个具体的MATLAB Socket通信的例子,可能包括客户端和服务器的MATLAB脚本,用于演示如何设置Socket连接,发送和接收数据。为了深入理解,你需要打开并分析这些示例脚本,看看它们是如何运用...

    一个简单的JAVA SOCKET的例子

    在这个"一个简单的JAVA SOCKET的例子"中,我们可以通过分析描述和标签了解到,它是一个基于Java的简单聊天程序,包含服务端和客户端,且使用了Swing库来构建用户界面,非常适合初学者学习。 首先,让我们从基础开始...

    java 网络编程的例子,可用

    一个简单的Java Socket通信例子: - **服务器端(ServerSocketExample.java)**: ```java ServerSocket server = new ServerSocket(8080); Socket clientSocket = server.accept(); PrintWriter out = new ...

    java socket服务器与客户端的通信实现用户登录

    这个socket通信比较直观,比较容易看懂,实现了Java中的socket的通信问题。是Java网络编程的一个比较不错的例子!

    socket通信例子

    本文将深入探讨“socket通信例子”,并结合Java技术和多线程网络通信来解析这一主题。 首先,Socket是TCP/IP协议族的一部分,它提供了一种在网络中两台计算机之间建立连接和交换数据的机制。在Java中,`java.net....

    有关Java的Socket编程入门例子

    通过这个入门例子,初学者可以理解Java Socket编程的基本原理和操作步骤,为进一步的网络编程打下坚实的基础。实际开发中,还可以结合NIO(非阻塞I/O)或其他高级框架如Netty,提高网络通信的效率和灵活性。

    java socket 客户端和服务端例子

    Java Socket是Java编程...总结来说,这个Java Socket例子展示了如何在Java中创建基本的客户端-服务器通信,特别是在处理中文数据时进行了优化。通过理解Socket的工作原理,我们可以构建出稳定、高效的网络应用程序。

    Android登录注册socket通信例子

    在Android应用开发中,Socket通信是一种常见的网络编程方式,它允许设备之间进行双向通信。本示例主要展示了如何在Android客户端实现登录和注册功能,通过Socket连接与服务器进行数据交互。下面将详细介绍这个过程...

    Java Socket传输图片源代码

    在Java编程语言中,Socket是实现网络通信的基础组件。它提供了进程间通信(IPC)的能力,特别是在不同机器之间。在本示例中,我们将深入探讨如何使用Java Socket进行图片的传输,这对于理解网络编程和数据交换至关...

Global site tag (gtag.js) - Google Analytics