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(); } } }
相关推荐
JAVA Socket通信示例,包含单工、半双工、全双工通信示例.zip
两者之间使用基于TCP的Socket通信方式。可是,做了一个测试小例子,结果从客户端传过来的都是乱码。于是上网查,希望可以找到解决方法,可是,网上有好多的答案,经过了很多的实验,都不能很好的解决。没办法只能靠...
LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf
java Socket通信实现源码示例
Flex与Java Socket通信 很适用的例子啊
1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现服务端; 2.重点解决安全策略问题:将flash发布为html格式后,本地访问页面后,一般可以与服务器进行socket通信;但是部署到tomcat服务器上后无法...
例子都可以跑通均已测试通过 com.socket 包中是一个简单的客户端发给服务器的例子 com.socket.complex 使用多线程来模拟通信 com.socket.block 根据客户端传递的参数来返回不同的信息
java socket 通讯例子附有源码 希望还不太理解java socket的原理的朋友,通过这3个简单到复杂的例子有锁帮助。 详细说明请下载。
这个socket通信比较直观,比较容易看懂,实现了Java中的socket的通信问题。是Java网络编程的一个比较不错的例子!
本项目是一个基于Socket通讯的例子源码,实现了一个简单的交互功能:安卓客户端发送“半径”值给服务端,服务器计算出圆面积,再发送回客户端。服务端是用的一个无限循环来等待客户端请求和消息,本项目有java服务端...
基于多线程实现的JavaSocket客户端-服务端点对点异步通信程序代码
这是个很全面的java写的socket通信,使用套接字实现基于TCP协议的服务器和客户机程序,还有个UDP协议的例子。文档很详细。
使用没有多线程的 java 进行套接字通信的示例。 编译 javac GreetingServer.java javac GreetingClient.java 跑步 *Server:* java GreetingServer *Client:* java GreetingClient <host> 例子 $ java ...
java异步通信例子 java NIO 异步socket
提供一个最简单的javasocket通信的例子
用java编写的基于Socket通信的例子--QQ,采用多线程,有图形界面,可以当做学习例子。
Android应用源码安卓与PC的Socket通信项目C#版+Java版,一个非常好用的代码,有C#和java
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码。 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,...
基于javaSocket通信的局域网聊天工具,是socket初学者的使用例子程序。