- 浏览: 231743 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u012414590:
博主,我想问一下,webdav能否集成到自己的服务器上,打个比 ...
WebDav 测试开发笔记 -
icarusliu:
java1997 写道博主,你好,正好用到这个,能不能贴个完整 ...
关于JTextPane中进行搜索结果显示的问题及解决 -
java1997:
博主,你好,正好用到这个,能不能贴个完整的使用代码啊,谢谢
关于JTextPane中进行搜索结果显示的问题及解决 -
RangerWolf:
非常感谢啊!
wsdl文档结构 -
chenk008:
Tomcat的类加载机制
接触Socket没多长时间,自己想模拟实现一个聊天程序,因此写出了这个原型。因为所有这些想法都是自己单独想出来的,也没有上网查实现一个聊天的程序应当怎么弄,所以其中肯定有很多不理想的地方。本身的目的只是为了熟悉一下Socket与多线程编程,所以如果觉得程序哪不好感谢各位赐教。
1. Server.java:做为一个中转站,接收来自各个用户线程传输过来的消息,然后将其发送到相应的目的地。
package com.icarusliu.learn.chart.test3; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server implements Runnable { private ServerSocket server; // 服务器信息 private static final int serverPort = 9001;// 端口是一定的 public Server() { try { server = new ServerSocket(serverPort);// 启动服务 } catch (IOException ex) { System.out.println("Server-Error:cannot init the Server!"); } } public void run() { System.out.println("Server-Server started!"); // 如果有用户请求,那么为用户配一个用户线程 while (true) { try { Socket socket = server.accept(); UserThread t = new UserThread(socket); Thread ut = new Thread(t); ut.start(); } catch (Exception ex) { ex.printStackTrace(); } } } /** * 用户线程,每个用户线程包括一个消息,一个接受线程,一个发送线程 * * @author Administrator * */ class UserThread implements Runnable { private Message message;//共用一个消息存储 private SendThread sendThread;//发送线程 private ReceiveThread receiveThread;//接收线程 private Socket socket; public UserThread(Socket socket) { this.socket = socket; message = new Message(); } public void run() { System.out.println("Server-User:" + socket.getInetAddress().getHostAddress() + "(" + socket.getPort() + ") connected!"); receiveThread = new ReceiveThread(socket); Thread rt = new Thread(receiveThread); rt.start(); // 发送的socket,用连接用户的socket sendThread = new SendThread(); Thread st = new Thread(sendThread); st.start(); } /** * 发送线程 * * @author Administrator * */ class SendThread implements Runnable { private void sendMessage() { try { Message m = message.getMessage(); Socket socket = new Socket(m.getToUrl(), m .getToPort()); System.out.println("Server-Sending:" + m); ObjectOutputStream output = new ObjectOutputStream(socket .getOutputStream()); output.writeObject(m);// 发送对象 output.flush(); output.close(); } catch (IOException ex) { System.out.println("发送线程没有连接上!发送失败!"); //这里表示要发送的目标客户没有连接上。因此如果没有连接上可以将这条消息保存下来等客户连接上的时候再发送过去。相当于QQ的离线消息 } } public void run() { sendMessage(); } } /** * 接收线程 * * @author Administrator * */ class ReceiveThread implements Runnable { private Socket socket; public ReceiveThread(Socket socket) { this.socket = socket; } /** * 接收到对象然后赋给message,再调用message上面阻塞的发送线程 */ private void setMessage() { try { ObjectInputStream input = new ObjectInputStream(socket .getInputStream()); Object messObject = input.readObject(); System.out.println("Server-Receiving:" + messObject); if (messObject instanceof Message) { Message m = (Message) messObject; message.setMessage(m); } } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { System.out.println("传输出现问题!"); } } public void run() { if (socket != null) { setMessage(); } } } } public static void main(String[] args) { Server s = new Server(); Thread st = new Thread(s); st.start(); } }
2.Client.java:客户端,通过Server中转来对其它客户端发送消息,并接受其它客户端的消息
package com.icarusliu.learn.chart.test3; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Client { //这个客户端的名称 private String name; //服务器信息 private final String serverUrl = "localhost"; private final int serverPort = 9001; //客户端信息,暂只有一个客户端,后面可以改成多个这些信息应该来自于客户端 private String clientUrl = "localhost"; private int clientPort = 9002; private int client2Port = 9003; public Client(String name,String clientUrl,int clientPort,int client2Port){ this.name = name; this.clientUrl = clientUrl; this.clientPort = clientPort; this.client2Port = client2Port; } public void start(){ try{ SendThread st = new SendThread(); Thread t = new Thread(st); t.start(); ReceiveThread rt = new ReceiveThread(); Thread rtt = new Thread(rt); rtt.start(); }catch(Exception ex){ ex.printStackTrace(); } } /** * 接收线程 * @author Administrator * */ class ReceiveThread implements Runnable{ public void run(){ try{ ServerSocket ss = new ServerSocket(clientPort); while(true){ Socket s = ss.accept(); ObjectInputStream input = new ObjectInputStream(s.getInputStream()); System.out.println(name + "-Receiving111:" + input.readObject()); input.close(); } }catch(IOException ex){ System.out.println("接收线程初始化失败!"); }catch(ClassNotFoundException ex){ System.out.println("没有找到对象!"); } } } /** * 发送线程 * @author Administrator * */ class SendThread implements Runnable{ public void sendMessage(String message){ try{ System.out.println(name + "Sending:" + message); Socket socket = new Socket(serverUrl,serverPort); Message m = new Message(message,clientUrl,client2Port,clientUrl,clientPort); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeObject(m); output.flush(); output.close(); }catch(IOException ex){ ex.printStackTrace(); } } public void run(){ int i=3; while(i-->0){ sendMessage("message from " + name + i); try{ Thread.sleep(1000); }catch(Exception ex){ ex.printStackTrace(); } } } } public static void main(String[] args){ Client client = new Client("client1","localhost",9002,9003); client.start(); Client client2 = new Client("client2","localhost",9003,9002); client2.start(); } }
3.Message.java:传递的消息对象
package com.icarusliu.learn.chart.test3; import java.io.Serializable; /** * 消息 * * @author Administrator * */ class Message implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String value; // 消息目的地 private String toUrl; private int toPort; // 消息来源 private String fromUrl; private int fromPort; public Message() { } public Message(String value, String toUrl, int toPort, String fromUrl, int fromPort) { this.value = value; this.toUrl = toUrl; this.toPort = toPort; this.fromPort = fromPort; this.fromUrl = fromUrl; } /** * 设置消息 唤醒等待线程 * * @param message */ public synchronized void setMessage(Message message) { this.value = message.getValue(); this.toUrl = message.getToUrl(); this.toPort = message.getToPort(); this.fromPort = message.getFromPort(); this.fromUrl = message.getFromUrl(); notifyAll(); } /** * 取得消息,如果消息为空,那么等待 * * @return */ public synchronized Message getMessage() { if (value == null || value.equals("")) { try { wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } Message message = new Message(value, toUrl, toPort, fromUrl, fromPort); this.setNull(); return message; } public String getToUrl() { return this.toUrl; } public int getToPort() { return this.toPort; } public String getFromUrl() { return this.fromUrl; } public int getFromPort() { return this.fromPort; } public String getValue() { return this.value; } public void setNull() { this.value = null; } public String toString() { return "Message:(" + this.getValue() + "-" + this.getFromUrl() + this.getFromPort() + "-" + this.getToUrl() + this.getToPort() + ")"; } }
4.执行结果:
Server端:
Server-Server started! Server-User:127.0.0.1(1179) connected! Server-User:127.0.0.1(1178) connected! Server-Receiving:Message:(message from client12-localhost9002-localhost9003) Server-Receiving:Message:(message from client22-localhost9003-localhost9002) Server-Sending:Message:(message from client22-localhost9003-localhost9002) Server-Sending:Message:(message from client12-localhost9002-localhost9003) Server-User:127.0.0.1(1182) connected! Server-User:127.0.0.1(1183) connected! Server-Receiving:Message:(message from client21-localhost9003-localhost9002) Server-Sending:Message:(message from client21-localhost9003-localhost9002) Server-Receiving:Message:(message from client11-localhost9002-localhost9003) Server-Sending:Message:(message from client11-localhost9002-localhost9003) Server-User:127.0.0.1(1186) connected! Server-User:127.0.0.1(1187) connected! Server-Receiving:Message:(message from client20-localhost9003-localhost9002) Server-Receiving:Message:(message from client10-localhost9002-localhost9003) Server-Sending:Message:(message from client20-localhost9003-localhost9002) Server-Sending:Message:(message from client10-localhost9002-localhost9003) Server-User:127.0.0.1(1191) connected! Server-User:127.0.0.1(1190) connected! Server-Receiving:Message:(message from client22-localhost9003-localhost9002) Server-Receiving:Message:(message from client12-localhost9002-localhost9003) Server-Sending:Message:(message from client22-localhost9003-localhost9002) Server-Sending:Message:(message from client12-localhost9002-localhost9003) Server-User:127.0.0.1(1195) connected! Server-User:127.0.0.1(1194) connected! Server-Receiving:Message:(message from client11-localhost9002-localhost9003) Server-Sending:Message:(message from client11-localhost9002-localhost9003) Server-Receiving:Message:(message from client21-localhost9003-localhost9002) Server-Sending:Message:(message from client21-localhost9003-localhost9002) Server-User:127.0.0.1(1198) connected! Server-User:127.0.0.1(1199) connected! Server-Receiving:Message:(message from client20-localhost9003-localhost9002) Server-Sending:Message:(message from client20-localhost9003-localhost9002) Server-Receiving:Message:(message from client10-localhost9002-localhost9003) Server-Sending:Message:(message from client10-localhost9002-localhost9003)
Client端:
client1Sending:message from client12 client2Sending:message from client22 client1-Receiving111:Message:(message from client22-localhost9003-localhost9002) client2-Receiving111:Message:(message from client12-localhost9002-localhost9003) client1Sending:message from client11 client2Sending:message from client21 client2-Receiving111:Message:(message from client11-localhost9002-localhost9003) client1-Receiving111:Message:(message from client21-localhost9003-localhost9002) client2Sending:message from client20 client1Sending:message from client10 client1-Receiving111:Message:(message from client20-localhost9003-localhost9002) client2-Receiving111:Message:(message from client10-localhost9002-localhost9003)
发表评论
-
JTable编辑器、渲染器及JTextPane着色、搜索实例——待办事项、日历及JSON格式化工具
2014-08-01 12:36 1504一直找不到一个顺手的待办事项工具,索性自己动手做了一个。主 ... -
SwingWorker的一个实践
2012-02-22 22:22 1777部门刚成立,开发的产 ... -
关于JTextPane中进行搜索结果显示的问题及解决
2012-02-19 13:33 1798在JTextPane中进行搜索结果显示时,第一次使用如下方法来 ... -
MigLayout的使用总结
2011-10-15 13:16 109601. 初始化: MigLayout l = new Mig ... -
Java实现的聊天工具(部分功能完成)
2011-10-15 12:17 4651准备换工作了,下一份工作也已经搞定。从学校毕业,浑浑噩噩的做了 ... -
详细介绍什么是Java虚拟机
2009-09-10 13:58 905一、什么是Java虚拟机 ... -
[实战]java回调函数
2009-09-04 15:29 1215(http://kidult.iteye.com/blog ... -
java float 与double
2009-08-27 16:15 26683浮点类型 : (1)float 型 内存分配4个字节 ... -
java多线程(包含生产者与消费者例子)
2009-08-26 17:11 3251java多线程 1.任务的run()方法通常总会有某种形 ... -
java编码规范
2009-06-02 14:03 1311Java ... -
【转】Java反射经典实例 Java Reflection Cookbook
2009-04-02 14:43 921关键字: 反射 Java提供了一套机制来动态执行方法和构造方 ... -
正则表达式
2008-10-08 14:56 880http://www.blogjava.net/nokiagu ... -
Eclipse3.3中Aptana的升级
2008-09-05 10:12 2372在线升级方法(此方式安装后能在线提示新版本上级,所以推荐使用 ... -
读数据库的一些笔记
2008-09-02 14:50 829今天在写一个连接数据库读数据的代码当中,发现速度很慢,(数据库 ... -
在JAVA文件中获取该项目的相对路径
2008-08-20 15:33 2708在做项目的时候,有JSP文件中很容易获取文件的相对路,但是在J ...
相关推荐
java多线程实现一个控制台聊天室 java多线程实现一个控制台聊天室
java 原型模式
Java EE项目原型设计工具,非常的犀利
搭建Java桌面应用程序原型
该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者 通过与服务器建立连接,来进行客户端与...
java sftp连接 java freemark实用 httpclient
在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接...
随着互联网的快速发展,网络聊天...经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统
Java 23种设计模式08原型模式.pdf
JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型。...由于 JavaScript 是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链
基于Java开发的AI语音聊天应用,产品原型技术验证
java 设计模式之原型模式
原型模式实践代码
Java设计模式-原型模式详解
用java实现的一个简单任务管理系统原型,供java初学者参考
中文聊天机器人原型系统的设计
一个学校网站原型界面,主要是静态的html页面!
适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,都是常用到的一些原型设计知识 适合入门级别的产品经理参考,...
NULL 博文链接:https://bellstar.iteye.com/blog/668206
java设计模式之原型模式,希望对大家有所帮助。