实现过程:
包括四个类:1,ChatClient:输入用户名,启动客户端子线程。2,ClientThread:根据用户名与服务端连接,接收服务端转发的消息并显示。
3,ChatServer:监听客户端请求,交给服务端子线程处理。4,ServerThread:处理客户端输入/输出和消息转发任务,在构造函数中在第一次建立连接时读取客户端发送的用户名并将其添加到客户端列表
package com.test.example;
import java.io.*;
import java.net.*;
public class ChatClient {
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
ClientThread client = new ClientThread(args[0]) ;
client.start() ;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
//读取键盘输入
String readline ;
while((readline = br.readLine()) != null){
if(readline.equals("bye")){
client.close() ;
System.exit(0) ;
}
client.send(readline) ;
}
}catch(IOException e){
e.printStackTrace() ;
}
}
}
package com.test.example;
import java.io.*;
import java.net.*;
public class ClientThread extends Thread {
Socket socket ;
BufferedReader br ;
PrintWriter pw ;
//启动客户端
public ClientThread(String username){
try{
//连接服务端
socket = new Socket("localhost", 12345) ;
br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
pw = new PrintWriter(socket.getOutputStream()) ;
//发送用户名
pw.println(username) ;
pw.flush() ;
}catch(IOException e){
e.printStackTrace() ;
}
}
//读取从服务端转发来的消息
public void run(){
try{
String readLine ;
while((readLine = br.readLine()) != null){
System.out.println("消息来自: " + readLine) ;
}
}catch(IOException e){
e.printStackTrace() ;
}
}
//发送消息
public void send(String message){
pw.println(message) ;
pw.flush() ;
}
//关闭客户端
public void close(){
try{
br.close() ;
pw.close() ;
socket.close() ;
}catch(IOException e){
e.printStackTrace() ;
}
}
}
package com.test.example;
import java.io.*;
import java.util.*;
import java.net.*;
public class ChatServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerSocket server = null ;
try{
server = new ServerSocket(12345) ;
System.out.println("服务器启动:" + server.getInetAddress().getHostAddress() + ":" + server.getLocalPort()) ;
//客户端列表
Hashtable<String, ServerThread> clienList = new Hashtable<String, ServerThread>() ;
//监听,处理
while(true){
Socket socket = server.accept() ;
new ServerThread(socket,clienList).start() ;
}
}catch(IOException e){
e.printStackTrace() ;
}finally{
try{
server.close() ;
}catch(IOException e){
e.printStackTrace() ;
}
}
}
}
package com.test.example;
import java.io.*;
import java.util.*;
import java.net.*;
public class ServerThread extends Thread {
Socket socket ;
BufferedReader br ;
PrintWriter pw ;
Hashtable<String, ServerThread> clientlist ; //客户端列表
String username ; //用户名
public ServerThread(Socket socket, Hashtable<String, ServerThread> clientlist){
this.socket = socket ;
this.clientlist = clientlist ;
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
pw = new PrintWriter(socket.getOutputStream()) ;
//读取用户名
this.username = br.readLine() ;
clientlist.put(username, this) ;
//显示连接信息
System.out.println(username + "连接:" + socket.getInetAddress().getHostAddress() + ":" + socket.getLocalPort()) ;
}catch(IOException e){
e.printStackTrace() ;
}
}
public void run(){
try{
//处理客户端输入
String line ;
while((line = br.readLine()) != null){
//用户输入信息
System.out.println(username + "发给 " + line) ;
System.out.println() ;
if(line.equals("bye"))
break ;
else{
//转发消息
String []arr = line.split(":") ;
if(arr.length == 2){
if(clientlist.containsKey(arr[0])){
clientlist.get(arr[0]).send(username + ":" + arr[1]) ;
}
}
}
}
br.close() ;
pw.close() ;
socket.close() ;
}catch(IOException e){
e.printStackTrace() ;
}
}
public void send(String message){
System.out.println("发给" + username + " " + message) ;
pw.println(message) ;
pw.flush() ;
}
}
分享到:
相关推荐
一款简单的TCP互相发送消息的程序,子进程和父进程可以互相发送或接受消息。
VS2010 CLR下写自定义消息发送与接收程序,同样适用于VS2008。程序有两个窗体,一个消息接收,一个消息发送,消息接收窗体内有一个按钮点击发送消息给本窗体,消息发送窗体内有一按键点击发送消息给消息接收窗体。...
可局域网中进行简单的消息发送器, 如果大家喜欢,我还有个比较早的发送器, 1998年就用Delphi做的,具有QQ那样的简单功能的。
演示线程消息发送,只是一个简单的实例 演示线程消息发送,只是一个简单的实例
理由很简单,消息是一个分布式的低耦合通讯方案。A发送一个消息到一个agent ,B作为接受者去agent上获取消息。但是A,B不需要同时到agent上去注册。agent作为一个中转为A,B提供搞效率的通讯服务。 Java消息服务支持两...
通过调用webSocketSev类的方法,指定用户名,实现指定用户发送消息和群发消息
组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。 步骤三:调用接口下发模板消息...
非常简单易用的一款小软件 能对任何窗口发送任何消息 适合WG编写初期使用
c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器断开后,重启。客户端重连
批量自动发送qq消息,群发,操作简单便捷; 启动qq聊天界面,设置好发送消息循环次数,双击vbs脚本,看结果吧 有可能被T哦
基于Mina的网络通讯,分为服务端和客户端。 研究selector NIO实现时,发现了这个架构。 Mina的底层实现实际就是selector和SocketChannel。所以如果对Mina源码感兴趣的可以先去看下selector相关的例子。
Delphi 模拟按键,将虚拟键转换为扫描码,模拟鼠标右键和左键以及发送消息的功能,Shift和Ctrl都定义了特殊的功能,一个简单的键盘鼠标模拟程序,适合Delphi初学者。比如模拟点击鼠标左键,具体的代码编写为: ...
linux 消息队列 发送端简单使用
skype群聊机器人自动发送消息报警先建一个聊天群,把标题改为 报警小精灵 程序启动之后会启动一个9999的端口,然后就可以向这个端口发送消息.群里就会刷新出来.注意因为skype有限制,尽量每分钟不要超过300条.
2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
JMS消息发送及订阅。详细代码,很简单。
VB 做的QQ消息自动发送 很简单的小程序 听到某些人要用QQ自动发送一些广告什么的 汗 这个可以利用一下 VB源码
一个简单的demo用于登陆Openfire 发送消息,接收消息,发送表情等功能
大道至简,消息队列可以简单概括为:“一发一存一收”,在这三个过程中消息发送最为简单,也比较容易入手,适合初中阶童鞋作为MQ研究和学习的切入点。因此,本篇主要从一条消息发送为切入点,详细阐述在RocketMQ这款...
通过go语言实现简单的发送钉钉自定义消息demo....................................................................